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代碼塊