我是靠谱客的博主 唠叨酸奶,最近开发中收集的这篇文章主要介绍JDBC:JAVA连接Mysql实现增删改查一、前置准备工作二、在IDEA上导入mysql对应版本的驱动三、代码参上!四、测试,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

总有特别赶的时候,小高叫你如何速通JAVA连接数据库Mysql实现增删改查。CV战士

一、前置准备工作

1、 安装IDEA,配置JAVA环境
2、 安装Mysql,配置Mysql环境变量
3、 安装SQLyog,测试连接成功
注解:IDEA可以私信我要链接;Mysql建议安装5.7或者8.0.26(免费);SQLyog可以私信我要链接

二、在IDEA上导入mysql对应版本的驱动

1、概述:在项目下new 一个名为lib的Directory文件夹,并导入对应Mysql版本型号的Mysql的jar包。
实操:①jar包下载。官网下载地址:https://dev.mysql.com/downloads/connector/j/
②将第一张图选中部分ctrl CV到第二张图片
③将外部jar包添加到IntelliJ IDEA项目。右键lib --> add as library --> Module Library --> OK
在这里插入图片描述
——————————————————————————————————
在这里插入图片描述

三、代码参上!

按照截图创建项目、包、类、配置文件

在这里插入图片描述

jdbc.properties配置文件

user=root
password=000000
url=jdbc:mysql://localhost:3306/test
driverClass=com.mysql.cj.jdbc.Driver

注解:
① 注意不要带空格
② 密码记得用自己的,我自己的是000000

JDBCUtils类

package com.xiaogao.util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

//数据库的连接与关闭类
public class JDBCUtils {
    //执行测试是否连接成功与关闭成功
    public static void main(String[] args) {
        getConnection();
        closeResource(null,null,null);
    }
//获取数据库的连接方法
    /*Connection接口
        是java API中提供的一个接口
        它的实现类由其他厂商完成,用来与数据库的连接
        这个接口可以调用方法,来获得SQL语句的对象(Statement,PreparedStatement)
            其中Statement接口本身使用较少,而他的子接口PreparedStatement却经常使用
                PreparedStatement比Statement更安全,没有SQL注入的问题
                它的实例对象表示一条预编译过的SQL语句
                可以发送SQL语句到数据库
                
注解:API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,
        目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,理解内部工作机制的细节。
     */
    //获取数据库的连接方法
    public static Connection getConnection() {
        Connection conn = null;
        try {
//1、读取配置文件中的四个基本信息

            //getSystemClassLoader()方法用于查找要委派的系统类加载器,这将是ClassLoader新实例的默认委派父级
            //Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,
            //    以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。
            //这个具体我也看不懂,如果感兴趣自己去查吧。     0.0
            //本人理解,通过调用ClassLoader类的具体方法实现调用配置文件为is对象的效果。

            //Properties继承了Hashtable类,以Map的形式进行放置值,put(key,value)和get(key),文本注释信息可以用”#”来注释。
            //	Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
            //	Properties文件内容的格式是:键=值 形式,Key值不能重复。
            Properties pros = new Properties();
            //方式一:调用load()方法,加载配置文件。
            //InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
            //pros.load(is);
            //方式二:load(InputStream) 加载配置文件,InputStream流的形式
            pros.load(ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"));

            //getProperty(String):String 获取配置文件属性
            //getProperty(String key):用指定的键在此属性列表中搜索属性。也就是通过参数key,得到key所对应的value。
            String user = pros.getProperty("user");
            String password = pros.getProperty("password");
            String url = pros.getProperty("url");
            String driverClass = pros.getProperty("driverClass");
//2、加载驱动
            //Class.forName:返回与给定的字符串名称相关联类或接口的Class对象。
            Class.forName(driverClass);
//3、获取连接
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("好耶!");
            System.out.println(conn);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        return conn;
    }
//数据库的关闭资源方法
    public static void closeResource(Connection conn,Statement ps,ResultSet rs){
        try {
            if (conn != null)
                conn.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            if (ps != null)
            ps.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        try {
            if (rs != null)
                rs.close();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        System.out.println("HH");
    }


}

PreparedStatementTest类

package com.xiaogao.util;

import com.mysql.cj.x.protobuf.MysqlxCrud;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class PreparedStatementTest {
    //通用增删改的方法  --增删改不同的表  --增删改不同的操作
    public static void testOthers(String sql,Object...args) {
        Connection conn = null;
        PreparedStatement ps = null;

        try {
//1、获取数据库的连接
            conn = JDBCUtils.getConnection();

//2、预编译sql语句,返回PrepareStatement的实例
            //Connection接口的实例调用了preareStatement(sql)的方法,返回了PrepareStatement接口的实例ps
            ps = conn.prepareStatement(sql);
//3、填充占位符
            for (int i = 0; i < args.length; i++) {
                //这里占位符的第一个对应的是args数组的第0个,因此i+1 和 i 的关系注意不要写错
                ps.setObject(i+1,args[i]);
            }
//4、执行
            ps.execute();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } finally {
//5、关闭资源
            JDBCUtils.closeResource(conn,ps,null);
        }
    }



    //通用的查找方法。  针对于不同表的通用查询操作,可以返回表中的多条数据
//#############################################################################################################
    //???下述中的泛型方法和泛型类和泛型接口并不是明白???
// #############################################################################################################
    public static <T> List<T> testSelect(Class<T> clazz, String sql, Object...args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = JDBCUtils.getConnection();
            ps = conn.prepareStatement(sql);
            for (int i = 0; i < args.length; i++) {
                ps.setObject(i+1,args[i]);
            }
            //返回执行查询语句后得到的ResultSet结果集,注意:该结果集永远不能为null。
            rs = ps.executeQuery();
            //获取结果集的元数据
//#############################################################################################################
            //??? 获取什么元数据,不太清楚???
// #############################################################################################################
            ResultSetMetaData rsmd = rs.getMetaData();
            //通过ResultSetMetaData获取结果集中的列数
            int columnCount = rsmd.getColumnCount();
            //创建集合对象
            ArrayList<T> list = new ArrayList<T>();
//#############################################################################################################
            //???   next???迭代器???  ???
// #############################################################################################################
            while (rs.next()){
                T t = clazz.newInstance();
                //处理一行数据中的每一个列,给t对象指定的属性赋值
                for (int i = 0; i < columnCount; i++) {
                    Object columnValue = rs.getObject(i + 1);
                    //获取每个列的列名
                    //columnLabel可以获取别名
                    String columnLabel = rsmd.getColumnLabel(i + 1);

                    //给t对象指定的某个属性,赋值为columnValue,通过反射来实现
                    Field field = clazz.getDeclaredField(columnLabel);
                    //防止属性设置为private
                    field.setAccessible(true);
                    field.set(t,columnValue);
                }
                list.add(t);
            }
            return list;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.closeResource(conn,ps,rs);
        }
        return null;
    }

    //测试
    public static void main(String[] args) {
        //修改操作
//        String sql = "update `order` set order_name = ? where order_id = ?";
//        testOthers(sql,"BB",2);
        //增加操作
//        String sql = "insert into `order` values(?,?,?)";
//        testOthers(sql,5,"HH","2002-11-27");
        //删除操作
//        String sql = "delete from `order` where order_name=?";
//        testOthers(sql,"HH");
        //查找操作
//#############################################################################################################
        //??? 这里的通用查询操作可不可以不用在java中创建表直接使用呢???
// #############################################################################################################
        String sql = "select id,name,email from customers where id < ?";
        List<Customer> list = testSelect(Customer.class, sql, 12);
        list.forEach(System.out::println);

    }

}

Customer

这个类是需要跟自己数据库的表对应的,可以自行更改,如果不会更改但又想傻瓜式复制的话,可以在数据库中创建该类。我先将数据库中的表结构与表内容截图如下,可以自行创建。
在这里插入图片描述
在这里插入图片描述

package com.xiaogao.util;

import java.util.Date;

public class Customer {
    private int id;
    private String name;
    private String email;
    private Date birth;

    public Customer() {
    }

    public Customer(int id, String name, String email, Date birth) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.birth = birth;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + ''' +
                ", email='" + email + ''' +
                ", birth=" + birth +
                '}';
    }
}

这个类也可以根据自己的需求自己创建,该类的内容包含如下:
----该类包含了本表的各列名称作为属性
----空参构造器和全餐构造器Constructor
----所有参数的Getter and Setter方法
----重写了toString()方法
在IDEA中使用快捷键alt+insert即可
在这里插入图片描述

四、测试

在JDBCUtils类中执行main方法,输出结果如下即为连接成功。

在这里插入图片描述

在PreparedStatementTest类的main方法中执行结果如下即为执行成功

在这里插入图片描述

最后,希望对大家有些帮助,如有错误敬请指正。

最后

以上就是唠叨酸奶为你收集整理的JDBC:JAVA连接Mysql实现增删改查一、前置准备工作二、在IDEA上导入mysql对应版本的驱动三、代码参上!四、测试的全部内容,希望文章能够帮你解决JDBC:JAVA连接Mysql实现增删改查一、前置准备工作二、在IDEA上导入mysql对应版本的驱动三、代码参上!四、测试所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部