• MySQL---JDBC编程


    什么是JDBC?

    JDBC:Java Database Connectivity,即Java数据库连接。是一种用于执行SQL语句的Java API,它是Java的数据库连接规范。

    API:Application Programming Interface,即应用程序编程接口。它提供了一组类/方法,可以让程序员直接调用。

    JDBC是怎么出现的呢?
    不同的数据库厂商都会提供各自的一组数据库API供程序员使用,这样就会带来两个问题:1.程序员的学习成本太高,得学习多种API来使用不同的数据库 2. 当哪一天需要给项目更换数据库时,改动非常大,不方便。 而Java是一门可移植性高的语言,它为了解决这些问题就提供了一组统一风格的数据库API,然后要求各个厂商适配这些API,程序员只要掌握这一组API就可以操作各种数据库了,这组API就叫做JDBC

    JDBC的工作原理

    JDBC为多种关系型数据库提供了统一访问方式,

    在这里插入图片描述

    JDBC的使用

    添加驱动

    1. 从网络获取到驱动资源
    2. 创建一个与src同级的目录,把刚才的驱动jar包拷贝进去

    在这里插入图片描述
    3. 右击新建好的目录,点击 Add as Library

    在这里插入图片描述

    创建数据源DataSource

    		//1.创建数据源对象
    		DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource)dataSource).setUser("root");
            ((MysqlDataSource)dataSource).setPassword("xu0123.");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 解释第一行代码

    在这里插入图片描述
    结合我们上面讲到的JDBC原理图,DataSource属于JDBC模块,MysqlDataSource属于驱动模块,DataSource是MysqlDataSource的父类,我们在使用JDBC进行数据库操作时都需要通过驱动将JDBC转化为数据库原生API才能让对应的数据库识辨指令。因此,在创建对象的时候也需要创建一个驱动对象。

    • 解释第二行代码

    在这里插入图片描述
    首先,setURL这个方法存在于MysqlDataSource中在DataSource中没有,所以需要向下转型。那为什么没有呢? 因为DataSource是JDBC中有的类,用来操作使用的数据库。但是,只有客户端—服务器结构的数据库才有URL的说法来定位服务器位置,对于非客户端—服务器结构的数据库不需要使用URL,所以DataSource就不能包含setURL方法。

    其次,URL是什么呢? URL就是 唯一资源定位符 。用来定位位置的。

    在这里插入图片描述

    • 解释第三行代码

    在这里插入图片描述
    输入数据库的用户名,默认都是 root 。用来登录数据库。

    • 解释第四行代码

    输入数据库的密码,每个用户都有自己的密码。用来登录数据库。

    • 为什么都得向下转型呢? 不能直接创建MysqlDataSource对象吗?
      在这里插入图片描述
      这个写法也是可以的,它没有使用多态。 但是它有一个问题:每个不同的数据库都需要使用不同的驱动,如果不统一向上转型用JDBC里有的DataSource保存,那么在更换数据库的时候所有使用MysqlDataSource的地方都得更换,提高了代码的耦合度!

    创建数据库连接Connection

    		//2.让代码和数据库服务器建立连接
            Connection connection = dataSource.getConnection();
    
    • 1
    • 2

    在这里插入图片描述

    注意在导包的时候使用第一个 不要使用第二个

    1. 还可以使用DriverManager的静态方法来建立数据库连接,但是一般不用!

    Connection connection = DriverManager.getConnection(url);

    1. 他们俩的区别是: DriverManager:每次getConnection都需要重新建立连接; DataSource:则是内置了连接池,实现了连接复用,提高了效率;

    创建操作命令Statement

    		//3.构造要执行的SQL语句
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入要插入的学号");
            int id = scanner.nextInt();
            System.out.println("请输入要插入的姓名");
            String name = scanner.next();
    
            String sql = "insert into student values(?,?)";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1,id);
            statement.setString(2,name);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    首先,把SQL语句写成一个字符串,并且使用占位符? 代替真正要操作的数据,这是为了避免有人使用SQL注入的方式来破坏你的数据库。

    其次,使用PreparedStatement进行预处理SQL语句,得到一个预处理过的SQL语句对象。

    然后,通过set方法来填充预处理SQL语句中的占位符?,把真正的数据替换进去。set方法的第一个参数表示替换第几个?,第二个参数表示填充的数据是啥。

    执行SQL指令

    		//4.执行SQL语句
            int n = statement.executeUpdate();
    
    • 1
    • 2

    执行方法有俩个:
    executeUpdate:对应插入、修改、删除语句使用。返回这次SQL操作影响到的行数。
    executeQuery:对应查询语句使用。返回查询的结果集。

    释放资源

    		//5.关闭释放资源
            statement.close();
            connection.close();
    
    • 1
    • 2
    • 3

    释放资源的顺序要和申请资源的顺序相反,即:先申请的后释放,后申请的先释放。

    通过JDBC演示CRUD

    新增

    	public static void main(String[] args) throws SQLException {
            //1.创建数据源对象
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource)dataSource).setUser("root");
            ((MysqlDataSource)dataSource).setPassword("xu0123.");
    
            //2.让代码和数据库服务器建立连接
            Connection connection = dataSource.getConnection();
    
            //3.构造要执行的SQL语句
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入要插入的学号");
            int id = scanner.nextInt();
            System.out.println("请输入要插入的姓名");
            String name = scanner.next();
    
            String sql = "insert into student values(?,?)";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1,id);
            statement.setString(2,name);
    
            //4.执行SQL语句
            int n = statement.executeUpdate();
    
            //5.关闭释放资源
            statement.close();
            connection.close();
    
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    查询(需要增加一步 遍历结果集合的操作)

    	public static void main(String[] args) throws SQLException {
            //1.建立数据源
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource)dataSource).setUser("root");
            ((MysqlDataSource)dataSource).setPassword("xu0123.");
    
            //2.建立程序和数据库的连接
            Connection connection = dataSource.getConnection();
    
            //3.构造SQL语句
            String sql = "select* from student where id = ?";
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入要查询的id");
            int inputId = scanner.nextInt();
    
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1,inputId);
    
            //4.执行SQL语句
            ResultSet resultSet = statement.executeQuery();
    
            //5.处理结果集
            while (resultSet.next()){
                //每次循环能得到结果集的一行
                //get方法里的参数代表要得到第几列的数据
                int id = resultSet.getInt(1);
                String name = resultSet.getString(2);
                System.out.println("id:"+ id + "name:" + name);
            }
    
            //6.释放资源
            resultSet.close();
            statement.close();
            connection.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    修改

    	public static void main(String[] args) throws SQLException {
            //1.创建数据源
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource)dataSource).setUser("root");
            ((MysqlDataSource)dataSource).setPassword("xu0123.");
    
            //2.建立程序和数据库的连接
            Connection connection = dataSource.getConnection();
    
            //3.构造SQL语句
            String sql = "update student set name = ? where id = ?";
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入要修改成什么名字");
            String name = scanner.next();
            System.out.println("请输入要修改的id");
            int id = scanner.nextInt();
    
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1,name);
            statement.setInt(2,id);
    
            //4.执行SQL
            int n = statement.executeUpdate();
    
            //5.释放资源
            statement.close();
            connection.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    删除

    	public static void main(String[] args) throws SQLException {
            //1.创建数据源
            DataSource dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/learning?characterEncoding=utf8&useSSL=false");
            ((MysqlDataSource)dataSource).setUser("root");
            ((MysqlDataSource)dataSource).setPassword("xu0123.");
    
            //2.建立程序和数据库的连接
            Connection connection = dataSource.getConnection();
    
            //3.构造SQL语句
            String sql = "delete from student where id = ?";
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入要删除的id");
            int id = scanner.nextInt();
    
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1,id);
    
            //4.执行SQL语句
            int n = statement.executeUpdate();
    
            //5.释放资源
            statement.close();
            connection.close();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    【SQL中limit的用法】
    软件测试功能测试全套常见面试题【功能测试】面试总结4-2
    Nacos 下载运行及配置
    国产MCU芯片(2):东软MCU概览
    【Java】Integer包装类底层设计原理
    天呐,我居然可以隔空作画了
    nodejs采集淘宝、天猫网商品详情数据以及解决_m_h5_tk令牌及sign签名验证(2023-09-09)
    Cemotion情感分析
    ClickHouse学习笔记之表引擎
    Java技能树-RE-元字符-贪婪模式/非贪婪模式
  • 原文地址:https://blog.csdn.net/weixin_62976968/article/details/133994934