JDBC (Java Database Connectivity) 是 Java 應用與關係數據庫交互的標準 API。本文從 ODBC 歷史溯源、JDBC 架構模型、四類驅動模式、核心接口實戰到設計模式本質,構建完整知識體系。
ODBC (Open Database Connectivity) 是微軟主導的 C 語言級數據庫訪問標準,核心組件:

ODBC 實現了「同一套代碼、不同驅動、訪問不同數據庫」的目標,但基於 C 指針、手動內存管理,與 Java 物件模型不兼容,跨平台困難。
JDBC 繼承 ODBC 思想,以 純 Java 接口 定義標準,廠商提供實現 (JDBC 驅動 JAR)。核心架構分層:

java.sql.Driver),翻譯標準調用為數據庫私有協議。本質:適配器模式。JDBC 接口適配各類數據庫協議,正如姚明在 NBA 的翻譯官,屏蔽底層差異,實現 Java 「一次編寫,到處運行」。
| 類型 | 名稱 | 原理 | 優缺點 | 代表 |
|---|---|---|---|---|
| Type 1 | JDBC-ODBC Bridge | JDBC → ODBC → DB | 依賴 ODBC 驅動,性能差,平台受限,Java 8 已移除。 | sun.jdbc.odbc.JdbcOdbcDriver |
| Type 2 | Native-API Driver | JDBC → Client Lib (C/C++) → DB | 需安裝客戶端庫,部署麻煩,非純 Java。 | Oracle OCI Driver |
| Type 3 | Network-Protocol Driver (Middleware) | JDBC → Middleware Server → DB | 中間件轉發,支持多數據庫,增加網絡跳數。 | IDA Server, DataDirect |
| Type 4 | Thin Driver (Pure Java) | JDBC → DB Native Protocol (TCP) | 純 Java、無客戶端、部署簡單、性能最優,現代標準。 | MySQL Connector/J, PostgreSQL JDBC, Oracle Thin |
結論:生產環境 100% 使用 Type 4 驅動,只需將廠商 JAR 放入 classpath。
// 1. 加載驅動 (JDBC 4.0+ SPI 自動加載,可省略)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 獲取連接
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
String user = "root", pwd = "123456";
Connection conn = DriverManager.getConnection(url, user, pwd);
// URL 格式:jdbc:subprotocol:subname
// MySQL: jdbc:mysql://host:port/db?params
// Oracle: jdbc:oracle:thin:@host:port:sid
// PostgreSQL: jdbc:postgresql://host:port/db
String sql = "SELECT * FROM t_user WHERE id = ? AND status = ?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setLong(1, 1001L);
ps.setInt(2, 1);
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) { /* 處理行 */ }
}
}
{call proc_name(?, ?)}。// 游標初始指向第一行之前
while (rs.next()) { // 移動到下一行,無行返回 false
long id = rs.getLong("id"); // 推薦用列名,可讀性強
String name = rs.getString("name");
// getInt, getDate, getBigDecimal, getObject...
}
conn.setAutoCommit(false);
try (PreparedStatement ps = conn.prepareStatement("INSERT INTO t_log(msg) VALUES(?)")) {
for (int i = 0; i < 10000; i++) {
ps.setString(i, "log-" + i);
ps.addBatch();
if (i % 1000 == 0) ps.executeBatch(); // 分批提交防 OOM
}
ps.executeBatch();
conn.commit();
} catch (Exception e) { conn.rollback(); throw e; }
conn.setAutoCommit(false);
try {
// 多條 DML
conn.commit();
} catch (Exception e) {
conn.rollback();
throw e;
} finally {
conn.setAutoCommit(true); // 恢復默認
}
// 自動關閉順序:ResultSet -> Statement -> Connection
try (Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// 業務邏輯
} // 編譯器自動生成 finally 關閉資源,杜絕洩漏
DriverManager.getConnection 每次建立物理連接,極其昂貴。必須使用連接池:
配置核心參數:maximumPoolSize、minimumIdle、connectionTimeout、idleTimeout、maxLifetime。
JDBC 是 Java 數據訪問的基石,掌握 PreparedStatement 參數化、try-with-resources 資源管理、連接池配置、事務邊界 是每位 Java 開發者的必修課。上層框架 (MyBatis, JPA, Spring JDBC, JOOQ) 均建立在 JDBC 之上,透徹理解底層機制,才能精準排查性能瓶頸、連接洩漏、死鎖等疑難雜症。