JDBC (Java Database Connectivity) 是 Java 應用訪問關係型數據庫的標準 API,同時為驅動廠商定義了服務提供者接口 (SPI)。核心目標:統一接口、跨數據庫、高性能、強類型。
| 類型 | 原理 | 適用場景 | 代表 |
|---|---|---|---|
| Type 1: JDBC-ODBC Bridge | JDBC → ODBC → DB | 企業內網、過渡方案 | Sun JDBC-ODBC Bridge |
| Type 2: Native API | JDBC → Client Lib (OCI/DB2 CLI) | 需安裝客戶端庫的環境 | Oracle OCI Driver |
| Type 3: Network Pure Java | JDBC → Middleware Server → DB | 多數據庫、三層架構、Applet | WebLogic, DataDirect |
| Type 4: Native Protocol Pure Java | JDBC → DB Native Protocol (TCP) | 互聯網/內網、無客戶端安裝、首選 | MySQL Connector/J, PostgreSQL JDBC, Oracle Thin |
趨勢:Type 3/4 為主流,Type 1/2 逐漸淘汰。Type 4 無中間層、純 Java、自動下載 (Applet/WebStart)、性能最佳。
// 1. 載入驅動 (JDBC 4.0+ 可省略,SPI 自動發現)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 獲取連接
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url, "user", "pass");
jdbc::
// 例
jdbc:mysql://host:port/dbname?param=value
jdbc:oracle:thin:@host:port:sid
jdbc:postgresql://host:port/dbname
jdbc 固定協議。subprotocol:驅動名/連接機制 (如 mysql, oracle:thin)。subname:定位數據庫的具體標識 (主機、端口、實例名、屬性)。| 接口 | 創建方法 | 適用場景 | 特點 |
|---|---|---|---|
Statement | createStatement() | 靜態 SQL、無參數 | 簡單、每次編譯 |
PreparedStatement | prepareStatement(sql) | 參數化 SQL、高頻執行 | 預編譯、防注入、性能優 |
CallableStatement | prepareCall(sql) | 調用存儲過程 | 支援 OUT/INOUT 參數 |
conn.setAutoCommit(false) 開啟手動事務:commit() 提交 / rollback() 回滾。READ_UNCOMMITTED (髒讀) READ_COMMITTED (不可重複讀) REPEATABLE_READ (幻讀) SERIALIZABLE (完全串行化)Class.forName() 載入驅動類 → 靜態塊創建實例 → DriverManager.registerDriver()。driver.connect(url, props),首個成功者勝出。executeQuery() 返回 ResultSet,游標前移 next(),getXxx() 取值。ResultSet → Statement → Connection (逆序),或使用 try-with-resources (JDK 7+)。execute() 處理多結果集/更新計數混合場景,配合 getResultSet()/getUpdateCount()/getMoreResults() 輪詢。@Transactional)。setFetchSize) 避免 OOM。SQLException,記錄 SQLState/ErrorCode,轉換為業務異常拋出。