首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JDBC 核心細節大全:架構/驅動/Statement三兄弟/事務/批處理/日期類型映射

     編輯:Java 綜合教學

JDBC 核心細節大全:架構/驅動/Statement三兄弟/事務/批處理/日期類型映射

一、JDBC 雙層架構

JDBC 架構圖

  • JDBC API:應用層調用接口
  • JDBC Driver API:驅動程序實現接口

二、核心接口與類

三、標準開發六步驟

  1. 導入驅動包
  2. 註冊驅動(JDBC 4.0+ SPI 自動載入,可省略)
  3. DriverManager.getConnection() 獲取連接
  4. 創建 Statement 執行查詢/更新
  5. 處理 ResultSet
  6. 關閉資源(Connection/Statement/ResultSet)

四、主流數據庫驅動與 URL

接口/類職責
DriverManager管理驅動註冊,根據子協議匹配驅動,獲取連接
Driver具體數據庫通信實現,應用很少直接調用
Connection數據庫會話上下文,所有通信通過此對象
Statement執行靜態 SQL,無參數支持
PreparedStatement預編譯 SQL,支持參數綁定,防注入,性能優
CallableStatement調用存儲過程,支持輸入/輸出參數
ResultSet結果集游標,迭代訪問查詢結果
SQLException數據庫錯誤封裝
數據庫驅動類URL 格式
MySQLcom.mysql.jdbc.Driverjdbc:mysql://host:port/db
Oracleoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:@host:port:db
DB2COM.ibm.db2.jdbc.net.DB2Driverjdbc:db2://host:port/db
Sybasecom.sybase.jdbc.SybDriverjdbc:sybase:Tds:host:port/db

五、Statement 三兄弟選型指南

接口適用場景參數支持
Statement一次性靜態 SQL不支持
PreparedStatement重複執行、帶參數 SQL支持(預編譯)
CallableStatement存儲過程調用支持(IN/OUT/INOUT)

六、Java-JDBC-SQL 類型映射

Java 類型 → setXxx() → JDBC 類型 → 數據庫類型

日期時間專項:

Java 類型JDBC 類型SQL 類型
java.util.DateTIMESTAMPDATETIME / TIMESTAMP
java.sql.DateDATEDATE(僅年月日)
java.sql.TimeTIMETIME(僅時分秒)
java.sql.TimestampTIMESTAMPTIMESTAMP(年月日時分秒毫微秒)

七、事務管理

默認自動提交,關閉自動提交三大理由:

  1. 性能:減少磁盤同步
  2. 業務完整性:ACID
  3. 分布式事務支持
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 影響行數。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved