JDBC (Java Database Connectivity) 是 Java 操作關聯式資料庫的標準 API。本文提供一個完整、可編譯執行的 JDBC 入門範例,涵蓋六大核心步驟:載入驅動、建立連線、建立 Statement、執行查詢、處理 ResultSet、關閉資源。
import java.sql.*;Class.forName("com.mysql.cj.jdbc.Driver") (JDBC 4.0+ 可省略)DriverManager.getConnection(url, user, pass)Statement.executeQuery(sql) 回傳 ResultSetrs.next(),用 getXxx("column") 取值import java.sql.*;
public class JdbcFirstExample {
// MySQL 8.0+ 連線字串範例(需依實際環境調整)
private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
private static final String DB_URL = "jdbc:mysql://localhost:3306/EMP?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8";
// 資料庫帳號密碼(請替換為實際值)
private static final String USER = "root";
private static final String PASS = "password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 步驟 1-2:載入驅動 (JDBC 4.0+ SPI 機制自動載入,可省略)
Class.forName(JDBC_DRIVER);
// 步驟 3:建立連線
System.out.println("連線資料庫中...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 步驟 4:建立 Statement 並執行查詢
System.out.println("建立 Statement...");
stmt = conn.createStatement();
String sql = "SELECT id, first, last, age FROM Employees";
rs = stmt.executeQuery(sql);
// 步驟 5:處理結果集
System.out.println("查詢結果:");
while (rs.next()) {
// 依欄位名稱取值(推薦,不依賴順序)
int id = rs.getInt("id");
int age = rs.getInt("age");
String first = rs.getString("first");
String last = rs.getString("last");
System.out.printf("ID: %d, Age: %d, First: %s, Last: %s%n", id, age, first, last);
}
} catch (SQLException se) {
// JDBC 相關錯誤
System.err.println("SQL 錯誤: " + se.getMessage());
se.printStackTrace();
} catch (ClassNotFoundException cnfe) {
// 驅動類別找不到
System.err.println("找不到 JDBC 驅動: " + cnfe.getMessage());
cnfe.printStackTrace();
} catch (Exception e) {
// 其他錯誤
e.printStackTrace();
} finally {
// 步驟 6:釋放資源 (逆序關閉,各自 try-catch 保護)
closeQuietly(rs);
closeQuietly(stmt);
closeQuietly(conn);
System.out.println("資源已釋放,程式結束。");
}
}
/** 靜默關閉 AutoCloseable 資源 */
private static void closeQuietly(AutoCloseable resource) {
if (resource != null) {
try {
resource.close();
} catch (Exception e) {
System.err.println("關閉資源時發生錯誤: " + e.getMessage());
}
}
}
}
# 編譯 javac -cp ".;mysql-connector-java-8.0.33.jar" JdbcFirstExample.java # 執行 (Windows) java -cp ".;mysql-connector-java-8.0.33.jar" JdbcFirstExample # 執行 (Linux/Mac) java -cp ".:mysql-connector-java-8.0.33.jar" JdbcFirstExample
連線資料庫中... 建立 Statement... 查詢結果: ID: 100, Age: 18, First: Zara, Last: Ali ID: 101, Age: 25, First: Mahnaz, Last: Fatma ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal 資源已釋放,程式結束。
String sql = "SELECT id, first, last, age FROM Employees WHERE age > ? AND last LIKE ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 20);
pstmt.setString(2, "K%");
try (ResultSet rs = pstmt.executeQuery()) {
// 處理結果
}
}
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
// 處理結果
}
} // 自動關閉 rs, stmt, conn
// HikariCP 範例
HikariConfig config = new HikariConfig();
config.setJdbcUrl(DB_URL);
config.setUsername(USER);
config.setPassword(PASS);
config.setMaximumPoolSize(20);
HikariDataSource ds = new HikariDataSource(config);
// 使用時
try (Connection conn = ds.getConnection()) {
// 業務邏輯
}
| 錯誤 | 原因 | 解決 |
|---|---|---|
| ClassNotFoundException | 驅動 JAR 不在 classpath | 加入 mysql-connector-java 依賴 |
| Communications link failure | IP/埠錯誤、防火牆、MySQL 未啟用遠端 | 檢查 url、bind-address、grant 權限 |
| Public Key Retrieval is not allowed | MySQL 8.0 預設 caching_sha2_password | URL 加 allowPublicKeyRetrieval=true 或改用 mysql_native_password |
| SSL connection error | MySQL 5.7+ 預設要求 SSL | URL 加 useSSL=false 或配置信任憑證 |
| Timezone 錯誤 | 伺服器時區未設定 | URL 加 serverTimezone=UTC 或 Asia/Taipei |