JDBC (Java DataBase Connectivity) 是 Java 標準 API,提供統一介面訪問關係型數據庫。核心優勢:跨平台、安全、易用、支援動態下載驅動。
應用程序 → JDBC API (java.sql/javax.sql) → JDBC Driver Manager → 具體驅動實現 (廠商提供) → 數據庫
Driver, Connection, Statement, ResultSet...)com.mysql.jdbc.Driver)Driver 介面)Class.forName("com.mysql.jdbc.Driver"); // 註冊到 DriverManager
常見數據庫驅動類與 URL 格式:
| 數據庫 | 驅動類 | URL 格式 |
|---|---|---|
| MySQL | com.mysql.jdbc.Driver | jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=UTF-8 |
| Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@host:1521:db |
| SQL Server 2005+ | com.microsoft.sqlserver.jdbc.SQLServerDriver | jdbc:sqlserver://host:1433;DatabaseName=db |
| PostgreSQL | org.postgresql.Driver | jdbc:postgresql://host:5432/db |
| DB2 | com.ibm.db2.jcc.DB2Driver | jdbc:db2://host:50000/db |
Connection 介面)String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; String user = "root", pwd = "123456"; Connection conn = DriverManager.getConnection(url, user, pwd);
Connection 代表會話上下文,提供事務控制(commit()/rollback())、創建 Statement、設置隔離級別等。
Statement 介面體系)| 類型 | 創建方法 | 適用場景 | 特點 |
|---|---|---|---|
Statement | conn.createStatement() | 靜態 SQL、無參數 | 每次編譯執行,效率較低 |
PreparedStatement | conn.prepareStatement(sql) | 參數化 SQL、批量執行 | 預編譯、防注入、可重用執行計劃、效率高 |
CallableStatement | conn.prepareCall("{call proc(?)}") | 調用存儲過程 | 支援 OUT/INOUT 參數 |
三大執行方法:
executeQuery(sql) → 返回 ResultSet (SELECT)executeUpdate(sql) → 返回影響行數 (INSERT/UPDATE/DELETE/DDL)execute(sql) → 返回 boolean,適用於任意 SQL 或多結果集ResultSet 介面)ResultSet rs = stmt.executeQuery("SELECT id, name FROM users");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
// 也可用列索引 rs.getInt(1)
}
rs.close();
游標默認前向只讀,可創建可滾動/可更新結果集:createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE)。
finally {
if (rs != null) try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
if (stmt != null) try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); }
if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
Java 7+ 推薦 try-with-resources 自動關閉:
try (Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
// 處理結果
}
PreparedStatement,防 SQL 注入、利用緩存計劃。LIMIT offset, size 深分頁性能崩塌。SQLException,記錄 SQL 狀態碼 (e.getSQLState()) 與廠商錯誤碼 (e.getErrorCode())。