
| 接口/類 | 職責 | |
|---|---|---|
| DriverManager | 管理驅動註冊,根據子協議匹配驅動,獲取連接 | |
| Driver | 具體數據庫通信實現,應用很少直接調用 | |
| Connection | 數據庫會話上下文,所有通信通過此對象 | |
| Statement | 執行靜態 SQL,無參數支持 | |
| PreparedStatement | 預編譯 SQL,支持參數綁定,防注入,性能優 | |
| CallableStatement | 調用存儲過程,支持輸入/輸出參數 | |
| ResultSet | 結果集游標,迭代訪問查詢結果 | |
| SQLException | 數據庫錯誤封裝 |
| 數據庫 | 驅動類 | URL 格式 |
|---|---|---|
| MySQL | com.mysql.jdbc.Driver | jdbc:mysql://host:port/db |
| Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@host:port:db |
| DB2 | COM.ibm.db2.jdbc.net.DB2Driver | jdbc:db2://host:port/db |
| Sybase | com.sybase.jdbc.SybDriver | jdbc:sybase:Tds:host:port/db |
| 接口 | 適用場景 | 參數支持 |
|---|---|---|
| Statement | 一次性靜態 SQL | 不支持 |
| PreparedStatement | 重複執行、帶參數 SQL | 支持(預編譯) |
| CallableStatement | 存儲過程調用 | 支持(IN/OUT/INOUT) |
Java 類型 → setXxx() → JDBC 類型 → 數據庫類型
日期時間專項:
| Java 類型 | JDBC 類型 | SQL 類型 |
|---|---|---|
| java.util.Date | TIMESTAMP | DATETIME / TIMESTAMP |
| java.sql.Date | DATE | DATE(僅年月日) |
| java.sql.Time | TIME | TIME(僅時分秒) |
| java.sql.Timestamp | TIMESTAMP | TIMESTAMP(年月日時分秒毫微秒) |
默認自動提交,關閉自動提交三大理由:
conn.setAutoCommit(false);
try {
// 多條 SQL...
conn.commit();
} catch (Exception e) {
conn.rollback();
throw e;
}
保存點:
Savepoint sp = conn.setSavepoint("SP1");
// ...
conn.rollback(sp); // 回滾到保存點
conn.releaseSavepoint(sp); // 釋放保存點
將多條 SQL 打包一次網絡往返執行,顯著提升吞吐。
// Statement 批處理
Statement stmt = conn.createStatement();
stmt.addBatch("INSERT INTO t VALUES(1)");
stmt.addBatch("INSERT INTO t VALUES(2)");
int[] counts = stmt.executeBatch();
conn.commit();
// PreparedStatement 批處理(推薦)
PreparedStatement ps = conn.prepareStatement("INSERT INTO t VALUES(?)");
for (int i = 0; i < 1000; i++) {
ps.setInt(1, i);
ps.addBatch();
}
int[] counts = ps.executeBatch();
conn.commit();
executeBatch() 返回 int[],每個元素對應單條 SQL 影響行數。