從 Maven 依賴、驅動類載入、Connection/Statement/ResultSet 生命週期管理,到預編譯防注入,完整示範。
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.2.0</version>
</dependency>
舊版 5.1 使用 mysql-connector-java,驅動類為 com.mysql.jdbc.Driver;8.0+ 為 com.mysql.cj.jdbc.Driver。
package com.example.demo;
import java.sql.*;
public class JdbcDemo {
private static final String URL = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
private static final String USER = "root";
private static final String PASS = "your_password";
public static void main(String[] args) {
// 1. 載入驅動(Java 6+ SPI 自動載入,可省略)
// Class.forName("com.mysql.cj.jdbc.Driver");
String sqlInsert = "INSERT INTO student(sno, sname, sex) VALUES (?, ?, ?)";
String sqlQuery = "SELECT sno, sname, sex FROM student";
try (Connection conn = DriverManager.getConnection(URL, USER, PASS);
PreparedStatement psInsert = conn.prepareStatement(sqlInsert);
PreparedStatement psQuery = conn.prepareStatement(sqlQuery);
ResultSet rs = psQuery.executeQuery()) {
// 關閉自動提交,示範事務
conn.setAutoCommit(false);
// 批次插入
for (int i = 1; i <= 3; i++) {
psInsert.setInt(1, 2023000 + i);
psInsert.setString(2, "學生" + i);
psInsert.setString(3, i % 2 == 0 ? "女" : "男");
psInsert.addBatch();
}
psInsert.executeBatch();
conn.commit();
System.out.println("批次插入提交成功");
// 查詢
System.out.printf("%-10s %-10s %s%n", "學號", "姓名", "性別");
while (rs.next()) {
System.out.printf("%-10d %-10s %s%n",
rs.getInt("sno"),
rs.getString("sname"),
rs.getString("sex"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
addBatch/executeBatch。maximumPoolSize、idleTimeout、connectionTestQuery。conn.setAutoCommit(false)、commit()/rollback(),業務邏輯完成後提交。useSSL=false、serverTimezone=UTC、characterEncoding=utf8、allowPublicKeyRetrieval=true(8.0+ 公鑰獲取)。SQLException,記錄 SQLState、ErrorCode、堆疊,區分死鎖/鎖等待/資料截斷等可重試錯誤。| 現象 | 原因 | 解決 |
|---|---|---|
| ClassNotFoundException | 驅動包未在 classpath | 檢查 Maven 依賴打包 |
| Communications link failure | IP/Port/防火牆/服務未啟動 | telnet 驗證連通性 |
| Public Key Retrieval is not allowed | 8.0+ caching_sha2_password 需公開鑰 | URL 加 allowPublicKeyRetrieval=true 或改用 mysql_native_password |
| 資料截斷 Data truncation | 欄位長度/型別不符 | 對齊實體類與表結構 |
JDBC 基礎雖簡單,但資源管理、連線池調優、預編譯防注入、事務邊界控制、異常重試策略,每一環都關係系統穩定。建立團隊統一的 DAO 規範與 BaseRepository,事半功倍。