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代码块

posted on 2025-11-23 18:23  才一斤  阅读(0)  评论(0)    收藏  举报

导航