2025/11/25
JDBC 操作数据库的完整流程:
加载数据库驱动 → DriverManager 获取 Connection(数据库连接)→ 通过 Connection 创建 Statement/PreparedStatement → 执行 SQL → 返回 ResultSet(查询结果)→ 关闭资源(ResultSet → Statement → Connection)
这四个组件的协作关系:DriverManager 是「连接工厂」,Connection 是「数据库会话」,Statement 是「SQL 执行器」,ResultSet 是「查询结果容器」。
DriverManager(驱动管理类)
核心定义
java.sql.DriverManager 是JDBC的「驱动管理器」,核心作用是:
注册 / 管理不同数据库的驱动(如 MySQL、Oracle 驱动);
根据数据库连接 URL、用户名、密码,获取 Connection 连接对象;
底层会遍历已注册的驱动,找到能匹配 URL 的驱动,创建对应的 Connection。
底层原理
数据库驱动(如 com.mysql.cj.jdbc.Driver)会在加载时,自动调用 DriverManager.registerDriver() 注册自身;
DriverManager.getConnection() 会遍历已注册的驱动,调用驱动的 connect() 方法,返回可用的 Connection;
MySQL 8.0+ 后,驱动类会自动加载(无需手动 Class.forName()),底层是利用 JDK 的「SPI 机制」自动扫描驱动。
主要的方法:DriverManager.getConnection(String url, String user, String password)
核心:获取数据库连接
关键参数:数据库连接 URL
URL 是驱动匹配的核心,不同数据库的 URL 格式不同,以 MySQL 为例:
jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
? 后是参数:
useSSL=false:关闭 SSL(开发环境用,生产环境建议开启);
serverTimezone=UTC:设置时区(解决 MySQL 8.0+ 时区报错);
characterEncoding=utf8:设置字符编码。
Connection(数据库连接对象)
核心定义
java.sql.Connection 代表 Java 程序与数据库的「一次会话连接」,是操作数据库的「基础入口」—— 所有 SQL 执行都必须基于 Connection。
每个 Connection 对应一个数据库会话,支持事务、创建执行器(Statement);
Connection 是「稀缺资源」,使用后必须关闭(否则会导致数据库连接池耗尽)
| 功能分类 | 核心方法 | 作用 |
|---|---|---|
| 创建执行器 | createStatement() | 创建 Statement(静态 SQL 执行器) |
| prepareStatement(String sql) | 创建 PreparedStatement(预编译 SQL 执行器,推荐) | |
| prepareCall(String sql) | 创建 CallableStatement(执行存储过程) | |
| 事务管理 | setAutoCommit(boolean autoCommit) | 设置是否自动提交事务(默认 true) |
| commit() | 提交事务 | |
| rollback() | 回滚事务 | |
| setTransactionIsolation(int level) | 设置事务隔离级别(如防脏读、不可重复读) | |
| 连接管理 | close() | 关闭连接(释放资源) |
| isClosed() | 判断连接是否关闭 |
关键:事务管理(实战必用)
数据库默认「自动提交事务」(执行一条 SQL 就提交),但复杂业务(如转账)需要手动控制事务:
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 1. 关闭自动提交(开启手动事务)
conn.setAutoCommit(false);
try {
// 2. 执行多条SQL(转账:A扣钱,B加钱)
String sql1 = "UPDATE account SET money = money - 100 WHERE id = 1";
String sql2 = "UPDATE account SET money = money + 100 WHERE id = 2";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(sql1);
stmt.executeUpdate(sql2);
}
// 3. 无异常则提交事务
conn.commit();
System.out.println("事务提交成功");
} catch (SQLException e) {
// 4. 有异常则回滚事务
conn.rollback();
System.err.println("事务回滚:" + e.getMessage());
}
} catch (SQLException e) {
e.printStackTrace();
}
避坑点
Connection 不能频繁创建 / 关闭:生产环境需用「数据库连接池」(如 Druid、HikariCP)复用连接;
事务回滚后,需重新开启事务(或恢复自动提交);
关闭 Connection 时,会自动关闭关联的 Statement/ResultSet。
ctrl+alt+T代码块
浙公网安备 33010602011771号