JDBC 是 Java 操作數據庫的基礎技術規範,非唯一技術。Hibernate、TopLink 等 ORM 構建於 JDBC 之上,性能有差距,但若 JDBC 用不好,還不如 ORM。本文系統總結 JDBC 核心原理、編程步驟、實戰範例、避坑鐵律,夯實基本功。
DriverManager 管理 → 獲取 Connectionjdbc:subprotocol:subname//host:port/dbnamejdbc:mysql://192.168.3.143:3306/zfvimsClass.forName("com.mysql.jdbc.Driver")jdbc.driversDriverManager.getConnection(url, user, pwd) → Connection 對象(表示數據庫會話,耗資源,用畢必關)conn.createStatement() → Statement(靜態 SQL)conn.prepareStatement(sql) → PreparedStatement(參數化動態 SQL,預編譯、防注入、性能優)executeQuery(sql) → ResultSet(游標遍歷 next()、getXxx()、可獲取元數據)executeUpdate(sql) → 影響行數ResultSet → Statement → Connection 逆序關閉,**必在 finally / try-with-resources 中**public class JdbcDemo {
public static Connection getConnection() throws SQLException {
try { Class.forName("com.mysql.jdbc.Driver"); }
catch (ClassNotFoundException e) { throw new SQLException("驅動加載失敗", e); }
return DriverManager.getConnection(
"jdbc:mysql://192.168.3.143:3306/zfvims", "lavasoft", "password");
}
public static void queryProvinces() {
String sql = "SELECT code, name FROM province ORDER BY code";
try (Connection conn = getConnection();
Statement stmt = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
System.out.println(rs.getString("code") + " " + rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) { queryProvinces(); }
}
conn.setAutoCommit(false)conn.commit() / conn.rollback()finally { conn.setAutoCommit(true); } 恢復默認LIMIT/OFFSET 或游標,避免全量載入內存SQLException,記錄 SQL 狀態碼、錯誤碼、堆棧,轉換為業務異常拋出| 層級 | 技術代表 | 核心價值 |
|---|---|---|
| 基石 | JDBC (DriverManager, DataSource) | 標準接口、驅動管理、連接獲取 |
| 連接池 | HikariCP, Druid, DBCP | 高性能連接複用、監控、防洩漏 |
| 模板封裝 | Spring JdbcTemplate, Apache DbUtils | 資源管理模板化、異常轉換、RowMapper |
| ORM | Hibernate, MyBatis, JPA/EclipseLink | 對象關係映射、緩存、延遲加載、查詢語言 |
| 類型安全 SQL | jOOQ, QueryDSL | 編譯期 SQL 檢查、流式 API、複雜查詢構建 |
| 響應式 | R2DBC, Spring Data R2DBC | 非阻塞數據庫訪問、背壓、異步流 |
JDBC 雖「底層」,卻是所有上層框架的根基。精通 JDBC 六步法、資源管理鐵律、PreparedStatement 參數化、事務邊界控制,是 Java 後端工程師的必修內功。無論框架如何演進,Connection → Statement → ResultSet 的核心模型永不落伍。夯實基本功,上層建築才穩固。