JDBC 是 Java 存取關聯式資料庫的標準 API。本文說明 MySQL Connector/J 驅動載入方式、建立連線、執行查詢/更新、預處理語句防注入、資源正確釋放與連線池整合最佳實踐。
// JDBC 4.0+ (Java 6+) 透過 SPI 自動載入,無需 Class.forName
// 相容舊版或顯式載入:
Class.forName("com.mysql.cj.jdbc.Driver"); // 8.0+ 驅動類別
// 旧版: com.mysql.jdbc.Driver
String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC&characterEncoding=utf8mb4";
String user = "root";
String password = "admin";
Connection conn = DriverManager.getConnection(url, user, password);
useSSL=false:本地開發關閉 SSL 減少握手延遲serverTimezone=UTC:避免時區警告characterEncoding=utf8mb4:支援完整 Unicode (含 Emoji)allowPublicKeyRetrieval=true:8.0+ 公開金鑰傳輸 (配合 caching_sha2_password)String sql = "SELECT * FROM pet";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
System.out.println(rs.getString("name") + " " + rs.getString("owner"));
}
}
String sql = "INSERT INTO pet (name, owner, species, sex, birth) VALUES (?, ?, ?, ?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "Fluffy");
pstmt.setString(2, "Harold");
pstmt.setString(3, "cat");
pstmt.setString(4, "f");
pstmt.setDate(5, Date.valueOf("2020-01-01"));
int affected = pstmt.executeUpdate();
System.out.println("影響行數: " + affected);
}
import java.sql.*;
public class MySQLJdbcDemo {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "admin";
String sql = "SELECT name, owner FROM pet";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
System.out.printf("%s %s%n", rs.getString("name"), rs.getString("owner"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// Maven 依賴
com.zaxxer
HikariCP
5.0.1
// 配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC");
config.setUsername("root");
config.setPassword("admin");
config.setMaximumPoolSize(20);
config.setMinimumIdle(5);
HikariDataSource ds = new HikariDataSource(config);
// 使用
try (Connection conn = ds.getConnection();
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM pet");
ResultSet rs = pstmt.executeQuery()) {
// ...
}
PreparedStatement 參數綁定JDBC 核心流程:載入驅動 → 取得連線 → 建立 PreparedStatement → 綁定參數 → 執行 → 處理 ResultSet → 釋放資源。現代開發請直接使用 HikariCP + PreparedStatement,並善用 try-with-resources 確保資源不洩漏。