JDBC:数据库读写的基石

JDBC在数据交互查询中起到重要的中间层作用,本文浅谈JDBC的主要步骤和Java简单应用。

JDBC基础

JDBC是Java与数据库交互的一组API。用户可以通过这组接口及其由厂商提供的JDBC驱动实现类数据库进行数据的读写。例如在多种数据库系统之间切换时,如MySQL、Oracle,只需要更换JDBC驱动依赖就可以轻松搞定。因此JDBC定义了一组可插拔的

传统的JDBC查询流程如下:

  1. 注册数据库驱动类。配置数据库连接信息,如数据库连接地址和用户名密码等。
  2. 通过DriverManager打开数据库连接,得到Connection实例。
  3. 通过数据库连接创建Statement实例。
  4. 使用Statement实例执行Result语句,得到结果集ResultSet。
  5. 使用ResultSet实例读取数据,将数据转换为JavaBean对象。
  6. 释放资源。ResultSet、Statement和数据库连接Connection。

下面来看一个Java中实际通过JDBC连接数据库读写数据的实例。

// 1. 数据库连接配置
final String username = "user";
final String password = "password";
final String jdbcUrl = "jdbc:mysql://localhost:3306/mydb?useSSL=false&characterEncoding=utf8";

// 2. 打开数据库连接
Connection connection = DriverManager.getConnection(jdbcUrl, username, password);
// 3. 获取Statement实例
Statement statement = connection.createStatement();

// 4. 通过statement执行sql
final String sql = "SELECT name FROM user where id = 1";
ResultSet resultSet = statement.executeQuery(sql);

// 5. 解析结果集
while (resultSet.next()) {
    String userName = resultSet.getString("name");
    System.out.println("Queried user name = " + userName);
}

// 6. 关闭资源
resultSet.close();
statement.close();
connection.close();

MySQL的JDBC驱动

MySQL目前的jdbc驱动版本是8.x,对应的驱动类名是com.mysql.cj.jdbc.Driver。这个版本的JDBC驱动适配java6+之后的版本。除了该版本之外还有com.mysql.jdbc.Driver这个驱动类实现,对应的版本是5.1

现在在Java中使用这个类会提示我们说

Loading class com.mysql.jdbc.Driver. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

因此现在选择驱动版本时,应首选com.mysql.cj.jdbc.Driver

5.1.x版本可以在mysql官方驱动来下载,下载地址。下图展示了oracle官网的驱动下载链接,可以选择5.1.x版本下载。

在绝大多数情况下,我们会使用maven或者gradle自动下载,不需要手动维护依赖包。

8.0和5.1驱动差异

8.0版本相较于5.1于以下几个方面进行了提升:

  1. 功能支持。提供了很多的新特性,例如JSON和窗口函数
  2. 性能优化。提高数据库的操作效率和吞吐量。
  3. 安全性增强。8.0版本默认开启了SSL/TLS连接,而5.1虽然支持但是并没有开启。
  4. 向前兼容。8.0版本兼容5.1版本,这也是软件开发的特性,新版本通常都要兼容旧版本。

JDBC驱动是如何被加载的?

数据库厂商提供的数据库驱动实现了JDBC的接口,因此我们可以轻松的通过JDBC的API与数据库交互。那数据库驱动是如何被加载且使用的呢?接口定义了一系列行为的规范,只要实现了这组接口就可以被用户所调用。在Java中,SPI机制被用于加载数据库驱动类。

mysql-connector-j.jar的jar包中可以看到这样一个文件:META-INF/services/java.sql.Driver,这个文件的内容如下:

com.mysql.cj.jdbc.Driver

该文件给出了这样一种表示,对应java.sql.Driver这个接口,当前jar提供了com.mysql.cj.jdbc.Driver的相应实现。

Java提供了ServiceLoader这个类来负责加载一个接口对应的实现,在该类中定义了查找路径:@1119 static final String PREFIX = "META-INF/services/";

因此我们就可以借助SPI机制使用JDBC驱动的实现类了,屏蔽了很多繁琐的工作。具体的SPI机制在这里不做赘述,感兴趣的读者可以自己查阅相关资料。除了JDK自己的SPI机制,也可以参考dubbo的加载机制,很有学习价值。

参考文章

  1. 廖雪峰:JDBC查询
posted @ 2024-04-04 16:51  想想牛牛会怎么做  阅读(1)  评论(0编辑  收藏  举报