JDBC 核心架構
JDBC (Java DataBase Connectivity) 定義統一接口,各數據庫廠商實現驅動:
java.sql、javax.sql:核心接口包
- 驅動 JAR:如
mysql-connector-java、postgresql、ojdbc
原生 JDBC 核心步驟
public class JdbcDemo {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 加載驅動(JDBC 4.0+ 可省略,SPI 自動加載)
Class.forName("com.mysql.jdbc.Driver");
// 2. 建立連接
String url = "jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=UTF-8";
conn = DriverManager.getConnection(url, "root", "root");
// 3. 創建語句對象
stmt = conn.createStatement();
// 4. 執行查詢
rs = stmt.executeQuery("SELECT * FROM user");
// 5. 處理結果集
while (rs.next()) {
String username = rs.getString("username");
System.out.println(username);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6. 關鍵:逆序關閉資源
closeQuietly(rs);
closeQuietly(stmt);
closeQuietly(conn);
}
}
static void closeQuietly(AutoCloseable c) {
if (c != null) try { c.close(); } catch (Exception ignored) {}
}
}
關鍵接口說明
| 接口 | 職責 | 核心方法 |
| Driver | 驅動註冊 | connect()、acceptsURL() |
| Connection | 數據庫會話 | createStatement()、prepareStatement()、commit()/rollback()、setAutoCommit() |
| Statement | 靜態 SQL 執行 | executeQuery()、executeUpdate()、execute() |
| PreparedStatement | 預編譯 SQL(防注入) | setXxx(index, val)、executeQuery()/Update() |
| ResultSet | 結果集游標 | next()、getXxx(columnIndex/Name)、getMetaData() |
PreparedStatement 防注入示例
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
try (Connection conn = DriverManager.getConnection(url, user, pwd);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, username);
ps.setString(2, password);
try (ResultSet rs = ps.executeQuery()) {
if (rs.next()) { /* 登錄成功 */ }
}
}
事務管理
conn.setAutoCommit(false);
try {
stmt.executeUpdate("UPDATE account SET balance = balance - 100 WHERE id = 1");
stmt.executeUpdate("UPDATE account SET balance = balance + 100 WHERE id = 2");
conn.commit();
} catch (Exception e) {
conn.rollback();
throw e;
} finally {
conn.setAutoCommit(true);
}
連接池演進必要性
- 頻繁創建銷毀連接:TCP 握手、認證、資源分配開銷大
- 連接數不可控:併發高時耗盡數據庫連接數限制
- 無狀態監控:無法感知連接泄漏、空閒超時、有效性驗證
主流連接池對比
| 連接池 | 特點 | 推薦場景 |
| HikariCP | 極致性能、輕量、零依賴、Spring Boot 2 默認 | 所有新項目首選 |
| Druid | 阿里出品、強大監控、SQL 防火牆、日誌分析 | 需要詳細監控、SQL 分析的企業級應用 |
| C3P0 | 老牌、配置豐富、性能一般 | 維護老項目 |
| DBCP2 | Apache Commons、Tomcat 默認 | Tomcat 容器管理數據源 |
HikariCP 核心配置
spring.datasource.hikari:
maximum-pool-size: 20
minimum-idle: 5
idle-timeout: 300000
connection-timeout: 30000
max-lifetime: 1800000
connection-test-query: SELECT 1
pool-name: MyAppPool
最佳實踐總結
- 始終使用
PreparedStatement 防 SQL 注入
- 資源關閉使用 Try-with-resources (Java 7+) 或工具類
- 生產環境必須使用連接池
- 合理設置事務邊界,避免長事務鎖表
- 批量操作使用
addBatch()/executeBatch()
- 大字段(BLOB/CLOB)使用流式讀寫
- 啟用慢 SQL 監控(Druid/HikariCP + p6spy)
- 上一篇文章: Java 異常處理實戰練習:自定義異常、運行時異常與業務邏輯解耦
- 下一篇文章: Java 初學者必懂核心術語:JVM、JDK、JRE、字節碼、類加載全解析
Copyright ©
程式碼之家 All Rights Reserved