JDBC (Java Database Connectivity) 是 Java 應用與關係型數據庫交互的基石。掌握其核心架構與操作流程,是進行企業級開發的必備技能。本文系統梳理 JDBC 核心概念、三大接口、標準操作步驟,並提供完整 CRUD 代碼範本。
| 概念 | 說明 |
|---|---|
| JDBC 本質 | Sun 公司定義的規範/接口,由各數據庫廠商實現驅動 |
| 核心 API 包 | java.sql、javax.sql |
| 關鍵類/接口 | DriverManager、Connection、Statement、ResultSet |
| 核心功能 | 建立連接、執行 SQL、處理結果集 |
職責:數據庫連接對象,代表通信通道
核心方法:
createStatement() - 創建 StatementprepareStatement(sql) - 創建 PreparedStatementsetAutoCommit(false) - 開啟事務commit()/rollback() - 事務提交/回滾職責:SQL 執行器,發送 SQL 語句
核心方法:
executeQuery(sql) - 執行查詢,返回 ResultSetexecuteUpdate(sql) - 執行增刪改,返回影響行數addBatch(sql) - 批量處理職責:結果集游標,封裝查詢結果
核心方法:
next() - 游標下移,返回 booleangetXxx(index/columnName) - 獲取列值getMetaData() - 獲取元數據Class.forName("com.mysql.cj.jdbc.Driver")DriverManager.getConnection(url, user, pwd)conn.createStatement() 或 conn.prepareStatement(sql)executeQuery() / executeUpdate()public class JdbcTemplate {
// 數據庫配置常量
private static final String URL = "jdbc:mysql://localhost:3306/dbname?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "123456";
// 獲取連接
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
// 通用查詢(返回 List<Map>)
public static List<Map<String, Object>> query(String sql, Object... params) {
List<Map<String, Object>> results = new ArrayList<>();
try (Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
// 綁定參數
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
try (ResultSet rs = ps.executeQuery()) {
ResultSetMetaData meta = rs.getMetaData();
int columnCount = meta.getColumnCount();
while (rs.next()) {
Map<String, Object> row = new HashMap<>();
for (int i = 1; i <= columnCount; i++) {
row.put(meta.getColumnLabel(i), rs.getObject(i));
}
results.add(row);
}
}
} catch (SQLException e) {
throw new RuntimeException("查詢失敗: " + sql, e);
}
return results;
}
// 通用增刪改
public static int update(String sql, Object... params) {
try (Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
for (int i = 0; i < params.length; i++) {
ps.setObject(i + 1, params[i]);
}
return ps.executeUpdate();
} catch (SQLException e) {
throw new RuntimeException("執行失敗: " + sql, e);
}
}
}
// 查詢所有用戶
List<Map> users = JdbcTemplate.query("SELECT id, username, email FROM users");
// 條件查詢
List<Map> user = JdbcTemplate.query("SELECT * FROM users WHERE id = ?", 1);
// 新增用戶
int rows = JdbcTemplate.update(
"INSERT INTO users(username, email, created_at) VALUES (?, ?, NOW())",
"zhangsan", "zhang@example.com"
);
// 修改郵箱
rows = JdbcTemplate.update(
"UPDATE users SET email = ? WHERE id = ?",
"new@example.com", 1
);
// 刪除用戶
rows = JdbcTemplate.update("DELETE FROM users WHERE id = ?", 1);
conn.setAutoCommit(false) 開啟,業務邏輯完成後 commit(),異常時 rollback()addBatch() + executeBatch() 提升性能| 錯誤現象 | 原因分析 | 解決方案 |
|---|---|---|
| ClassNotFoundException | 驅動包未導入或版本不匹配 | Maven 引入正確版本驅動依賴 |
| Communications link failure | URL/IP/端口錯誤、防火牆攔截 | 檢查數據庫服務狀態、網絡連通性、配置參數 |
| SQL 語法錯誤 | 保留字衝突、引號缺失 | 表名/列名加反引號 ` `,使用 PreparedStatement |
| 中文亂碼 | 字符集不一致 | URL 添加 characterEncoding=utf8,數據庫表 charset=utf8mb4 |
掌握 JDBC 基礎後,建議進一步學習連接池原理、ORM 框架(MyBatis/JPA)、分布式事務等進階主題。記住:參數化查詢是安全的基石,連接池是性能的保障。