前言
JDBC
是一套 API
,用 Java
语言写成,用于在 Java
程序中访问数据库。
数据库有很多种,不同的数据库有不同的实现细节、通信协议。如果我们每次访问一种数据库, 都要手写代码访问这个数据库,费时费力,严重降低开发效率,而且极易出错。
JDBC
为 Java
开发者提供了统一的访问数据库的接口,我们不用关心我们访问的是哪种数据库,我们只要配置数据库的地址、用户名、密码,就可以通过 JDBC
访问数据库了。
JDBC API
JDBC API
由两个 package
组成:
常用的类
DriverManager
DataSource
Connection
Statement
PreparedStatement
CallableStatement
ResultSet
代码示例
下面是我们手动编码访问 MySQL
数据库的流程:
- 获取连接
- 执行
SELECT
语句 - 获取结果集
- 关闭结果集、连接等资源
这种方式是最底层、最原始的。
一般情况下,应用开发框架(比如 Spring
)都会屏蔽这些细节,在幕后为我们处理好 连接打开/关闭、异常、事务提交/回滚、资源释放、数据转换等问题,给我们提供了更方便、更高级的 API
。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.SQLException;
public class Mydb1 {
static String URL = "jdbc:mysql://localhost/mydb";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(URL, "root", "root");
stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM MyTable");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException ex) {
// ignore
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException ex) {
// ignore
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException ex) {
// ignore
}
}
}
}
}
版本
JDK 8
使用 JDBC 4.2
。
JDBC drivers
类型
- Type 1:先在客户端访问
ODBC driver
,然后访问数据库 - Type 2:先在客户端访问数据库厂商的本地库,然后访问数据库
- Type 3:完全用
Java
编写,先访问一个服务端中间件,然后访问数据库 - Type 4:完全用
Java
编写,使用数据库本地协议直接访问数据库(下文讨论的MySQL Connector/J
属于这类 )
厂商
Oracle
提供了一个列表,展示哪些厂商提供了 JDBC drivers
。
下文我们重点研究常用的 MySQL
。
MySQL
MySQL
提供了 MySQL Connector/J 8.0
作为 JDBC driver
。
Maven 引入依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
看下 pom.xml
<?xml version="1.0" encoding="UTF-8" ?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<packaging>jar</packaging>
<name>MySQL Connector/J</name>
<description>JDBC Type 4 driver for MySQL</description>
<licenses>
<license>
<name>The GNU General Public License, v2 with FOSS exception</name>
<distribution>repo</distribution>
<comments>For detailed license information see the LICENSE file in this distribution.</comments>
</license>
</licenses>
<url>http://dev.mysql.com/doc/connector-j/en/</url>
<scm>
<connection>scm:git:git@github.com:mysql/mysql-connector-j.git</connection>
<url>https://github.com/mysql/mysql-connector-j</url>
</scm>
<organization>
<name>Oracle Corporation</name>
<url>http://www.oracle.com</url>
</organization>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.19.4</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-common</artifactId>
<version>2.14.1</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
我们可以看到这个 JDBC driver
叫做 MySQL Connector/J
,类型是 Type 4
。
<name>MySQL Connector/J</name>
<description>JDBC Type 4 driver for MySQL</description>
Spring 配置数据源
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://host:3306/xxx
username: xxxxxx
password: xxxxxx
注:com.mysql.cj.jdbc.Driver
取代了 com.mysql.jdbc.Driver
。
MySQL Connector/J 8.0
官网:https://dev.mysql.com/doc/connector-j/8.0/en/
重点可以看下这几节:
简单总结下,MySQL Connector/J 8.0
支持:
- Connection Pooling - 连接池化
- Load Balance - 负载均衡
- Failover - 故障切换
参考资料
- https://en.wikipedia.org/wiki/Java_Database_Connectivity
- https://dev.mysql.com/doc/connector-j/8.0/en/
本文完。