Java Database Connectivity | 8lovelife's life
0%

Java Database Connectivity

JDBC 是 Java Database Connectivity 的缩写,是 Java 应用程序的 API,用于访问数据库。1997年2月19日发布的 JDK 1.1 版本中就已经包含了 JDBC 的实现,从 JDBC 3.0 版本开始,JDBC 在 JCP (Java Community Process) 机制下进行迭代开发。在 JSR 54 中有关于 JDBC 简短的底层技术描述:JDBC is a Java API for executing SQL statements

JDBC 历史版本

JDBC 由 Oracle Corporation 开发,发布至今已经有 26 年的历史,代码分布在 java.sql 和 javax.sql 包中。目前 JDBC 的最新版本是 4.3,发布于 2017 年。下面是 JDBC 发布历史时间表,以及对应的 JDK 实现

Year JDBC Version JSR JDK Version
2017 JDBC 4.3 JSR 221 - release 3 Java SE 9
2014 JDBC 4.2 JSR 221 - release 2 Java SE 8
2011 JDBC 4.1 JSR 221 - release 1 Java SE 7
2006 JDBC 4.0 JSR 221 Java SE 6
2004 JDBC RowSet Implementrations JSR 114 J2SE 1.5
2000 JDBC 3.0 JSR 54 J2SE 1.4
1998 JDBC 2.x - J2SE 1.2 / J2SE 1.3
1997 JDBC 1.2 - JDK 1.1

JDBC 版本特性

JDBC 3.0 将不同的 JDBC 2.x 版本规范合并,并开始在 JSR 下迭代开发,JDBC 3.0 主要目标是技术功能完善,JDBC 4.0 主要目标是提供更好的开发体验

JDBC 驱动

JDBC 4.0 支持 自动加载驱动,3.0 需要指定驱动加载

1
2
3
4
5
6
// 3.0
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:13306/mydb?user=root&password=123456");

// 4.0
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:13306/mydb?user=root&password=123456");

JDBC 4.x 新特性

JDBC Version New Feature
4.0 支持驱动自动加载
4.1 支持 try-with-resource
4.2 支持 REF CURSOR
4.3 支持 Sharding

JDBC 驱动类型

JDBC 驱动类型主要有以下四种

JDBC Driver 类别
Type 1 JDBC-ODBC bridge
Type 2 Native-API driver
Type 3 Middleware driver
Type 4 Database-Protocol driver

image

可以发现 Type 4 类型的驱动性能应该是最好的,mysql-connector-j 的驱动类型属于 Type 4 driver

JDBC 核心 API

  • DataSource 代表实际连接的数据库
  • Connection 数据库连接可以通过 DataSource 对象获取,用于执行 Statement 和 获取 ResultSet
  • Statement 可以通过 Connection 对象获取,用于执行 SQL 语句
  • PrepareStatement 可以预编译 SQL 语句,防止 SQL 注入
  • ResultSet 代表数据执行的查询结果

image

1
2
3
4
5
6
7
8
9
10
// 简单代码事例
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setPort(13306);
dataSource.setDatabaseName("mydb");
dataSource.setUser("root");
dataSource.setPassword("123456")
Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
String sql = "INSERT INTO test VALUES ('hello')";
stmt.executeUpdate(sql);

Vendor Driver

主流数据库几乎都提供了对应的 JDBC Driver,比如 Hive 的 hive-jdbc,Mysql 的 mysql-connector-j,Clickhouse 的 clickhouse-jdbc 等。JDBC 的设计完全符合 OCP、DIP 原则,扩展数据源非常方便

image

如果项目中有换存储方案的需求,理论上只需要更换对应的 jdbc driver 就可以了

集成

虽然 JDBC 提供了完整的访问数据库能力,但直接使用 JDBC 操作数据库,过于复杂,并且会增加过多的样板代码。在真实的项目开发中,我们会使用数据库连接池 Hikari 来提高数据库操作的吞吐量,并引入持久层框架来降低代码复杂度,比如使用:Spring JDBC Template 、MyBatis、Hibernate 等,并且基于不同场景可以选择使用不同的持久层框架,比如可以使用 JDBC Template 来进行大数据集记录的批量新增、更新(需要配置rewriteBatchedStatements=true)

HikariCP

HikariCP 是一款高性能的 JDBC 连接池

1
2
3
4
5
6
7
8
9
10
11
// 依赖包
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>

// 创建连接池
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:13306/mydb?user=root&password=123456");
HikariDataSource dataSource = new HikariDataSource(config);

MyBatis

MyBatis 是一款流行的 ORM 框架,可以通过 Mapper 接口绑定配置 SQL 进行数据库访问

1
2
3
4
5
6
7
8
9
10
11
// 依赖包
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.11</version>
</dependency>

// 创建 SqlSessionFactory
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource());
return factoryBean.getObject();

JDBC Template

JDBC Template 由 Spring 提供,可以简化 JDBC 操作

1
2
3
4
5
6
7
8
9
// 依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

// 创建 JDBC Template
DataSource dataSource = ...;
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);