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