核心步驟三部曲
- 加載驅動:`Class.forName("com.mysql.cj.jdbc.Driver")` (MySQL 8.0+)
- 建立連接:`DriverManager.getConnection(url, user, password)`
- 資源關閉:`try-with-resources` 自動關閉 Connection/Statement/ResultSet
標準代碼範本 (Java 7+)
import java.sql.*;
public class JdbcDemo {
// 數據庫配置常量 (實際項目應放入配置文件/環境變量)
private static final String URL = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
private static final String USER = "root";
private static final String PASSWORD = "123456";
// MySQL 8.0+ 驅動類
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
public static void main(String[] args) {
// 1. 加載驅動 (JDBC 4.0+ SPI 機制可省略,但建議顯式加載)
try {
Class.forName(DRIVER);
System.out.println("驅動加載成功");
} catch (ClassNotFoundException e) {
throw new RuntimeException("找不到 MySQL 驅動,請檢查 maven 依賴", e);
}
// 2. try-with-resources 自動管理連接生命周期 (核心最佳實踐)
String sql = "SELECT id, username, email FROM users WHERE id = ?";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement ps = conn.prepareStatement(sql)) {
// 3. 設置參數 (防止 SQL 注入)
ps.setInt(1, 1001);
// 4. 執行查詢
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String email = rs.getString("email");
System.out.printf("用戶: %d - %s - %s%n", id, username, email);
}
}
} catch (SQLException e) {
// 統一異常處理:記錄日誌、轉換為業務異常、事務回滾等
System.err.println("數據庫操作失敗: " + e.getMessage());
e.printStackTrace();
}
}
}
關鍵配置參數解析 (URL 參數)
| 參數 | 推薦值 | 作用 |
| useSSL | false | 禁用 SSL (本地開發),生產環境建議 true 並配置憑證 |
| serverTimezone | UTC / Asia/Shanghai | 解決時區不匹配導致時間偏移 (MySQL 8.0 必須) |
| characterEncoding | utf8 / utf8mb4 | 保證中文讀寫不亂碼 |
| allowPublicKeyRetrieval | true | MySQL 8.0 caching_sha2_password 插件需開啟 |
| rewriteBatchedStatements | true | 批量插入性能優化 (關鍵!) |
| useServerPrepStmts | true | 服務端預編譯,配合準備語句提升性能 |
進階:生產環境必須使用連接池
頻繁創建/銷毀物理連接極其昂貴。主流連接池對比:
| 連接池 | 特點 | 適用場景 |
| HikariCP | 性能最強、輕量、Spring Boot 2.x 默認 | 所有新項目首選 |
| Druid | 監控強大、SQL 防火牆、阿里巴巴出品 | 需要詳細 SQL 監控、防注入的國內項目 |
| DBCP2 | Apache 老牌、穩定 | 舊項目維護 |
HikariCP 配置範例 (application.yml)
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8mb4&rewriteBatchedStatements=true
username: root
password: 123456
hikari:
minimum-idle: 5
maximum-pool-size: 20
auto-commit: true
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
pool-name: MyHikariPool
事務管理與異常處理最佳實踐
public void transfer(String from, String to, double amount) {
Connection conn = null;
try {
conn = dataSource.getConnection(); // 從連接池獲取
conn.setAutoCommit(false); // 開啟事務
// 扣款
updateBalance(conn, from, -amount);
// 入賬
updateBalance(conn, to, amount);
conn.commit(); // 提交事務
} catch (SQLException e) {
if (conn != null) {
try { conn.rollback(); } catch (SQLException ex) { log.error("回滾失敗", ex); }
}
throw new BusinessException("轉賬失敗", e);
} finally {
if (conn != null) {
try { conn.close(); } catch (SQLException e) { log.error("關閉連接失敗", e); }
// 連接池實現中 close() 實為歸還連接
}
}
}
// Spring @Transactional 註解方式更簡潔 (推薦)
@Transactional(rollbackFor = Exception.class)
public void transfer(String from, String to, double amount) {
updateBalance(from, -amount);
updateBalance(to, amount);
}
常見問題排查清單
- ClassNotFoundException:缺少 `mysql-connector-java` 依賴,或版本不匹配 (5.x vs 8.x 驅動類名不同)。
- Communications link failure:IP/端口錯誤、防火牆攔截、MySQL `bind-address` 未配置 0.0.0.0。
- Public Key Retrieval is not allowed:URL 加 `allowPublicKeyRetrieval=true`。
- 時區問題:URL 加 `serverTimezone=Asia/Shanghai`。
- 中文亂碼:URL 加 `characterEncoding=utf8mb4`,表字符集為 utf8mb4。
- 批量插入慢:URL 加 `rewriteBatchedStatements=true`,使用 `PreparedStatement.addBatch()`。
總結
JDBC 連接 MySQL 的核心在於:正確的驅動版本、完整的 URL 參數、連接池複用、PreparedStatement 防注入、try-with-resources/事務邊界管理。掌握這五點,即可構建穩健高效的數據訪問層。
- 上一篇文章: Java 四大引用類型深度解析:強、軟、弱、虛引用與 GC 交互機制
- 下一篇文章: Java 程序員成長路線圖:從入門到架構師的五階段進階指南
Copyright ©
程式碼之家 All Rights Reserved