• MySQL数据库之JDBC编程


    前面的话

    本篇文章将介绍JDBC编程,JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。

    ??博客主页:的博客主页
    ??欢迎关注??点赞??收藏留言??
    ??本文由原创,CSDN首发!
    ??首发时间:??2022年7月4日??
    坚持和努力一定能换来诗与远方!
    ??推荐书籍:??《高性能MySQL》
    ??参考在线编程网站:??牛客网??力扣
    博主的码云gitee,平常博主写的程序代码都在里面。
    博主的github,平常博主写的程序代码都在里面。
    ??作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


    ??导航小助手??


    封面区


    1.JDBC前置工作

    1.1准备好MySQL驱动包

    MySQL的jdbc驱动包我们可以去官网下载,我们也可以maven中央仓库下载,这个maven中央仓库是什么呢?你可以理解为我们手机中的“应用商店”软件,它的作用和应用商店的作用是差不多的,只不过手机应用商店里面是手机软件,而maven中央仓库里面有许多的API以及依赖包。

    现在MySQL已经被Oracle收购了,Oracle的“吃相”有点难看,从官网找可以找到,但是我感觉maven中央仓库更好找一点,所以我们到maven中央仓库下载jdbc驱动包。

    网址:maven中央仓库

    第一步,点进网址进入maven中央仓库。
    1

    第二步,搜索MySQL,选择如下图那一个。
    2
    第三步,点击进入,找到对应大版本的jdbc驱动包,如果你的MySQL是5版本那驱动包也选择5版本的,当然如果你的MySQL是8版本,那你的驱动包也选择8版本。

    我的MySQL是5版本所以我选择大版本为5的驱动包。
    3
    第四步,点击进去,按下图操作,下载驱动包。
    4
    下载完成我们的驱动包就准备好了。

    1.2创建项目

    使用编译器创建一个项目,项目创建好后,按照下面的步骤操作:

    第一步,创建一个目录,名字随便起,不妨叫做lib目录。
    1

    第二步,将下载好的驱动包拷贝到该目录。
    2

    第三步,设置选项,右键刚才创建并已经将驱动包拷贝的目录,找到As a Lib…
    3
    4
    这样我们的驱动包就导进我们的项目中了,然后我们就能来写jdbc代码了。

    2.JDBC编程步骤

    2.1创建数据源DataSource

    第一步,创建DataSource对象,来描述这个数据库在哪里。

    DataSource dataSource = new MysqlDataSource();
    
    • 1

    其中DataSourcejava.sql里面的一个jdbc接口,MysqlDataSource是来源与我们所下载驱动包中的一个实现DataSource接口的类。

    第二步,设置数据库的“位置”(URL),登录数据库的账户名和密码。

            //设置数据库所在地址
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jdbctest/characterEncoding=utf8&useSSL=false");
            //设置登录数据库的账户名
            ((MysqlDataSource)dataSource).setUser("root");
            //设置登录数据库的密码
            ((MysqlDataSource)dataSource).setPassword("123456");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    jdbc:mysql://127.0.0.1:3306/jdbctest?characterEncoding=utf8&useSSL=false就是一个URL,也叫唯一资源定位符。
    jdbc:mysql表示该url是用于jdbc mysql的URL,因为数据库有很多,不止jdbc一种,所以需要细分。

    具体含义自主对照:URL类型声明://数据库的地址/数据库名?字符集编码&是否加密

    2.2连接数据库

    第三步,和服务器建立连接,创建好数据源DataSource对象后,调用该对象的getConnection()方法,获取java.sql.Connection对象,这样就与数据库建立起来连接了。

    Connection connection = dataSource.getConnection();
    
    • 1

    2.3构造并执行sql语句(插入操作为例)

    第四步,构造sql语句字符串,并将该语句包装成PreparedStatement对象,即调用Connection对象的prepareStatement方法,参数是sql字符串,会返回一个PreparedStatement对象,然后我们再调用PreparedStatement对象中的executeUpdate方法或executeQuery方法执行sql语句。

    我们先以插入操作为例。

            //操作数据库 关键在于构造sql语句
            //jdbc 构造的sql语句不需要带上;
            String sql = "insert into student values(1, '张三')";
            //将sql字符串包装成一个语句对象,表示待执行的sql的对象
            PreparedStatement statement = connection.prepareStatement(sql);
    
            //执行sql
            //如果待执行的sql语句操作是insert, update, delete,则使用executeUpdate方法执行,返回值为影响数据的行数
            //如果待执行的sql语句操作是select,则使用executeQuery方法执行
            int ret = statement.executeUpdate();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其中,如果待执行的sql语句操作是insert, update, delete,则使用executeUpdate方法执行,返回值为影响数据的行数,如果待执行的sql语句操作是select,则使用executeQuery方法执行,返回值是一个ResultSet结果表对象。

    2.4及时释放资源

    第五步,释放资源,我们执行完毕sql语句后需要及时地将资源释放,在JDBC编程中,最常见需要释放的类或接口有三个,分别是ConnectionPreparedStatementResultSet,其中前面两个在jdbc插入操作中已经使用过了,而最后一个,即ResultSet,它是在执行查询语句需要用到的,调用executeQuery方法执行查询语句之后,会返回一个“临时表”,该“临时表”上储存了查询的结果,我们可以通过遍历该结果表来获取查询数据库的结果。

    //此时sql语句已经执行完毕了,需要释放资源
    statement.close();
    connection.close();
    
    • 1
    • 2
    • 3

    使用jdbc编程进行插入操作全部代码:

    import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class TestJdbc {
    
        public static void main(String[] args) throws SQLException {
            DataSource dataSource = new MysqlDataSource();
            //设置数据库所在地址
            ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jdbctest?characterEncoding=utf8&useSSL=false");
            //设置登录数据库的账户名
            ((MysqlDataSource)dataSource).setUser("root");
            //设置登录数据库的密码
            ((MysqlDataSource)dataSource).setPassword("123456");
    
            //建立连接
            Connection connection = dataSource.getConnection();
    
            //操作数据库 关键在于构造sql语句
            //jdbc 构造的sql语句不需要带上;
            String sql = "insert into student values(1, '张三')";
            //将sql字符串包装成一个语句对象,表示待执行的sql的对象
            PreparedStatement statement = connection.prepareStatement(sql);
    
            //执行sql
            //如果待执行的sql语句操作是insert, update, delete,则使用executeUpdate方法执行,返回值为影响数据的行数
            //如果待执行的sql语句操作是select,则使用executeQuery方法执行
            int ret = statement.executeUpdate();
    
            //此时sql语句已经执行完毕了,需要释放资源
            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
    • 37
    • 38

    运行结果,我们通过查询数据库的表的结果来进行观察:

    mysql> create database jdbctest;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> use jdbctest;
    Database changed
    mysql> create table student(id int, name varchar(20));
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> show tables;
    +--------------------+
    | Tables_in_jdbctest |
    +--------------------+
    | student            |
    +--------------------+
    1 row in set (0.00 sec)
    -- 执行jdbc代码后查询
    mysql> select * from student;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | 张三   |
    +------+--------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    程序运行结果,表示1行受到了影响。
    3

    2.5不要写死的代码(以插入为例)

    我们发现我们的sql语句是完完全全写死的,这一点不好,我们可以使用输入的操作让用户输入信息进行插入,那就需要使用到Scanner类了。

    我们得到用户输入的信息后,我们需要对信息进行整合,最容易想到的方式就是字符串拼接,但是这么做有如下的缺点,一是容易写错,特别是单双引号比较多的情况下,二是不安全,黑客可以使用sql注入的方式来修改数据库。

    所以更好的方法就是把sql字符串中待输入的信息使用?来代替或者叫做占位,然后通过PreparedStatement中的setXXX系列方法来逐个设置每个?的内容是什么。

    这个系列的方法,第一个参数表示sql待执行对象中第多少个?,第二个参数表示将这个?设置的内容。比如:

            //操作数据库 关键在于构造sql语句
            //jdbc 构造的sql语句不需要带上;
            String sql = "insert into student values(?, ?)";
            //将sql字符串包装成一个语句对象,表示待执行的sql的对象
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1, id);
            statement.setString(2, name);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    完整代码:jdbc插入操作源代码

    运行结果:
    4
    数据库查询结果:

    mysql> select * from student;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | 张三   |
    |    2 | 李四   |
    +------+--------+
    2 rows in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.6JDBC删除,更新操作

    在jdbc编程中,删除操作和更新操作,它的步骤与插入操作是一模一样的,只不过就是构造的sql语句不一样,其他都一样。

    删除操作关键代码:

            //用户输入
            System.out.println("请输入需要删除的学号:");
            int id = sc.nextInt();
    
            //操作数据库 关键在于构造sql语句
            //jdbc 构造的sql语句不需要带上;
            String sql = "delete from student where id = ?";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setInt(1, id);
            System.out.println("statement" + statement);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    jdbc删除操作完整代码:源代码地址

    程序运行结果:
    7

    数据库查询结果:

    mysql> select * from student;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | 张三   |
    +------+--------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    更新操作关键代码:

            //用户输入 需要修改的id 与修改后的姓名
            System.out.println("请输入需要修改的学号:");
            int id = sc.nextInt();
            sc.nextLine();
            System.out.println("请输入修改后的姓名:");
            String afterName = sc.nextLine();
    
            //操作数据库 关键在于构造sql语句
            //jdbc 构造的sql语句不需要带上;
            String sql = "update student set name = ? where id = ?";
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1, afterName);
            statement.setInt(2, id);
            System.out.println("statement" + statement);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    jdbc更新操作完整代码:源代码地址

    程序运行结果:

    8

    数据库查询结果:

    mysql> select * from student;
    +------+--------+
    | id   | name   |
    +------+--------+
    |    1 | 王五   |
    +------+--------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.7JDBC查询操作

    jdbc的查询操作与插入删除更新操作有一点点不同,执行查询sql语句的时候是调用executeQuery方法来执行语句的,并且会带回查询的结果,我们可以通过类似与迭代器的操作来获取查询的结果,这个结果集使用完后需要将它释放。

    关键代码:

            //操作数据库 关键在于构造sql语句
            //jdbc 构造的sql语句不需要带上;
            String sql = "select * from student";
            PreparedStatement statement = connection.prepareStatement(sql);
    
            //执行sql 查询操作返回的不是int 而是一个临时表 使用ResultSet对象表示这个临时表
            ResultSet ret = statement.executeQuery();
    
            //便利结果集合
            //预期结果格式
    //        +------+--------+
    //        | id   | name   |
    //        +------+--------+
    //        |    1 | 王五   |
    //        +------+--------+
            while (ret.next()) {
                int id = ret.getInt("id");
                String name = ret.getString("name");
                System.out.println("id:" + id + ", name:" + name);
            }
            //关闭资源
            ret.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

    jdbc查询操作完整代码:源代码地址

    程序运行结果:
    10
    好了,JDBC的全部内容差不多就是这一些,所有的完整代码链接:地址


    下期预告:数据库事务

    觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

    1-99

  • 相关阅读:
    CPP线程管理类实现
    C++模板
    Kubernetes学习笔记【2年以前的笔记】
    web:[HCTF 2018]admin
    数据分享|SAS数据挖掘EM贷款违约预测分析:逐步Logistic逻辑回归、决策树、随机森林...
    Oracle中两张表具有相同结构,如何将一张表内容全部插入到另一个表中
    用C语言编写你自己内核
    网站ping端口的操作方法和命令介绍
    晶圆代工由一家独大,到三足鼎立,再到群雄涿鹿,到底经历了什么?
    2304. 网格中的最小路径代价 : 从「图论最短路」过渡到「O(1) 空间的原地模拟」
  • 原文地址:https://blog.csdn.net/bsegebr/article/details/126036817