Java的JDBC编程

x33g5p2x  于2022-02-28 转载在 Java  
字(6.4k)|赞(0)|评价(0)|浏览(271)

一、Java的数据库编程:JDBC

JDBC,即Java Database Connectivity,java数据库连接。是一种用于执行SQL语句的Java API,它是Java中的数据库连接规范。这个API由 java.sql.,javax.sql. 包中的一些类和接口组成,它为Java开发人员操作数据库提供了一个标准的API,可以为多种关系数据库提供统一访问。

二、JDBC的作用及转换器——数据库驱动程序

由于MySQL是一个CS(client/sever)结构的系统,即需要客户端和服务器交互的系统。若不使用MySQL的客户端,我们需要自己通过代码来实现MySQL客户端来代替MySQL自带的客户端。但是客户端不是凭空产生的,真正要我们去实现是很复杂的。因此数据库会提供一些API(application programming interface)来方便我们去实现。

数据库的种类有很多,例如MySQL、Oracle、SQL Sever 等等,它们提供的API各不相同,API实际上不是真正的接口,它是一组函数/类/方法 让用户去使用,在此处,接口是一个非常广义的概念,它跟Java语法中的接口没有直接关系。

正是因为不同的数据库提供的API各不相同,因此Java中引入了JDBC,它能够将不同数据库提供的API都转化为Java中为我们提供的API——JDBC,它相当于涵盖了各种数据库操作的操作方式,把不同数据库的API给统一到了一起。

但是将不同数据库的API都转换为JDBC,需要一个“中间转换器”,这个中间转换器就是数据库驱动程序,它能把不同种类的API转换成JDBC风格的API。就好比先前有很多格式的充电头,若到现在,可以用“转接头”来换我们手机的插头接口。那么数据库驱动程序就是“转接头”。

不同的数据库需要分别提供不同的驱动程序,在Java中这样的驱动程序是一个独立的“jar包”。这个jar包是发布Java程序常见方式。未编译的程序是.java文件,编译后变为.class文件。jar包里面都是一些.class文件(类似于.rar/.zip),将这些.class文件打成一个压缩包。

需要的驱动程序可以到maven仓库官网中去下载:maven仓库官方地址

但是mysql jdbc driver的版本是非常多的,下载的jar包版本必须要和你的mysql服务器版本一致。mysql服务器的版本查看方式:

查找“服务”,找到MySQL服务器,点击属性:

MySQL的版本为5.7,那么可以在官网中下载5.几的版本都可以。

要想使用jar包,就需要把jar包中导入到IDEA中,让代码能够访问到jar中的类。

a) 先在主文件上创建一个Directory

b) 创建好Directory之后,将我们的jar包复制粘贴到该Directory中,粘贴只需将光标点中创建的Directory包后ctrl+v复制即可。

c) 配置项目的一些属性,让项目能够找到jar包。

选择现在文件路径下的文件夹即可。

还有另外一种方法,右键新创建的Directory,add as library,再点击ok即可。

如果在代码中能够访问到jar包中的类,就算添加成功。

三、JDBC编程的步骤

  1. 创建DataSource对象(这是准备工作)
  2. 基于DataSource对象,创建Connection对象,和数据库建立连接(打开了客户端,输入了密码,连接成功了)
  3. PrepareStatement对象拼装具体的SQL语句(客户端中输入SQL的过程)
  4. 拼装好SQL之后,需要执行SQL(客户端中敲下回车,此时SQL就被发到服务器了)
  5. 查看服务器返回的结果(客户端显示的结果)
  6. 关闭连接,释放资源

四、JDBC示例展示及具体步骤分析(重要)

1.使用JDBC插入数据

例如:在MySQL客户端中在某个数据库中已经创建好Student表的情况下:

下面的注释根据这个代码来解释的。

public class Test {
    public static void main(String[] args) throws SQLException {
// 1.创建DataSource对象(DataSource对象生命周期应该是要跟随整个程序)
        DataSource dataSource = new MysqlDataSource();
//接下来需要针对dataSource进行一些配置,以便后面能够顺利的访问到数据库服务器
//主要配置三方面信息,URL,USER,PASSWORD,需要向下转型(父类引用转换为子类引用的实例)
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8&useSSL=true");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("111111");
//2.和数据库建立连接,建立好连接之后就可以进行后续的数据传输了
//  建立连接的意义是为了验证当前的网络通信是否正常
//  如果不正常就会抛出SQLException异常
//  connection对象生命周期应该是较短的,每个请求创建一个新的connection
        Connection connection = dataSource.getConnection();
//3.拼装SQL语句,用到PrepareStatement对象
//  先以插入数据为例
//  当前示例中要插入的数据内容都是写死的,其实也可以让程序在运行时获取到
//  动态地拼接上去

        int id = 1;
        String name = "曹操";
        int classId = 10;
//?是一个占位符,可以把具体的变量的值替换到?位置
        String sql = "insert into student values(?,?,?)";
        PreparedStatement statement = connection.prepareStatement(sql);
//1,2,3相当于?的下标(从1开始算)
        statement.setInt(1,id);
        statement.setString(2,name);
        statement.setInt(3,classId);
        System.out.println("statement: "+ statement);
//4.拼装完毕之后,可以执行SQL了
//insert delete update都是使用executeUpdate方法来执行
//select就使用executeQuery来执行
//返回值表示此次操作修改了多少行
        int ret = statement.executeUpdate();
        System.out.println("ret: "+ret);
//5.执行完毕后,关闭释放相关资源
//一定是后创建的被释放,顺序不能搞错
        statement.close();
        connection.close();
    }
}

a) DataSource dataSource = new MysqlDataSource();中DataSource是Java自带的类,但MysqlDataSource是jar包中的类,因此如果导入成功才能真正导入它。
注:dataSource的生命周期应该是要跟随整个程序的。

b) ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8&useSSL=true");解释如下:

注意:在MySQL自带的数据库中需要创建好student名字的数据库,并且还需要创建好student名字的表才能成功执行。

在写characterEncoding字符集时,即使my.ini文件配置的是utf8
mb4,也要写为utf-8,否则会执行错误。因为JDBC要兼容多种数据库,而utf8mb4编码是MySQL独有的。

每个标点符号的顺序和个数都不能打错!!

c) ((MysqlDataSource)dataSource).setUser("root"); ((MysqlDataSource)dataSource).setPassword("111111");
第一行输入的是用户名,每个电脑上的用户名都是不变的——root。
第二行输入的是密码。
注意:两行中的形成都是字符串的形式,因此要带上双引号。
d) Connection connection = dataSource.getConnection(); 通过dataSource来获取Connection对象,Connection就是为了测试当前是否准备就绪,能否进行后续的通信。因此当连接失败时,编译器能够告诉你那么就通过抛出异常来处理。
注意:
1.Connection是连接的意思,不能写作链接(Link)。
2. 在导入Connection类中注意不要导错包,需要导的包是java.sql中的包。

核心就是根据不同的场景拼装成不同的SQL,其它逻辑都基本上不发生变化。

2.使用JDBC查找数据

public class JDBCSelect {
    public static void main(String[] args) throws SQLException {
        // 1.创建DataSource对象(DataSource对象生命周期应该是要跟随整个程序)
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8&useSSL=true");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("111111");
        //2.创建Connection对象,和数据库建立连接
        Connection connection = dataSource.getConnection();
        String sql = "select * from student";
        //3.借助PrepareStatement拼装SQL语句
        PreparedStatement statement = connection.prepareStatement(sql);
        //4.执行 SQL 语句
        ResultSet resultSet = statement.executeQuery();

        //5.遍历结果集,遍历过程和使用迭代器遍历集合类有点相似
        //  结果集相当于一张表,这个表里面有很多行,每一行是一条记录(又包含很多列)
        //  next()一方面是判定当前释放存在下一行,另一方面如果存在下一行就获取到这一行
        //  可以直观的把 resultSet 对象想成一个”光标“
        while(resultSet.next()) {
            //resultSet 的光标指向了当前行,就可以把当前行中的列数据都获取到
            //当前表中的每一行包含三个列,id,name,classId,可以根据列名来获取对应的列数据,此处参数中的写的列名必须和数据库表中的列名完全一致,顺序可以不同
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            int classId = resultSet.getInt("classId");
            System.out.println("id:"+id+" name:"+name+" classId:"+classId);
        }
        //6.关闭资源,后创建的对象先关闭
        resultSet.close();
        statement.close();
        connection.close();
    }
}

resultSet的next方法可以这样理解:

五、JDBC常用接口和类

1.JDBC API

在Java JDBC编程中对数据库的操作均使用JDK自带的API统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握Java JDBC API (位于 java.sql 包下) 即可掌握Java数据库编程。

2.DataSource类

DataSource用于配置如何连接MySQL。

3.数据库连接Connection

Connection接口实现类由数据库提供,获取Connection对象通常有两种方式:

  • 一种是通过DriverManager(驱动管理类)的静态方法获取:
// 加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 创建数据库连接
Connection connection = DriverManager.getConnection(url);
  • 一种是通过DataSource(数据源)对象获取。实际应用中会使用DataSource对象
DataSource ds = new MysqlDataSource();
((MysqlDataSource) ds).setUrl("jdbc:mysql://127.0.0.1:3306/student?characterEncoding=utf-8&useSSL=true");
((MysqlDataSource) ds).setUser("root");
((MysqlDataSource) ds).setPassword("111111");
Connection connection = ds.getConnection();
  • 以上两种方式的区别是:
  1. DriverManager类来获取的Connection连接,是无法重复利用的,每次使用完以后释放资源时,通过connection.close()都是关闭物理连接。
  2. DataSource提供连接池的支持。连接池在初始化时将创建一定数量的数据库连接,这些连接是可以复用的,每次使用完数据库连接,释放资源调用connection.close()都是将Conncetion连接对象回收。

3.PreparedStatement类

PreparedStatement对应到一个SQL语句。

主要掌握两种执行SQL的方法:

  1. executeQuery() 方法执行后返回单个结果集的,通常用于select语句
  2. executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete语句

4.ResultSet类

ResultSet表示select查找的结果的结果集。

ResultSet里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条记录,就要使用ResultSet的next()方法 ,如果我们想要得到ResultSet里的所有记录,就应该使用while循环。

相关文章