mysql-connector-java-x.x.x.jar)。CLASSPATH 環境變數)。// 1. 加載驅動 (JDBC 4.0+ 可省略,ClassLoader 自動發現)
Class.forName("com.mysql.jdbc.Driver"); // MySQL 8.0+ 用 com.mysql.cj.jdbc.Driver
// 2. 建立連線
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String user = "root", pass = "root";
Connection conn = DriverManager.getConnection(url, user, pass);
// 3. 建立 Statement
Statement stmt = conn.createStatement();
// 4. 執行查詢
String sql = "SELECT * FROM user";
ResultSet rs = stmt.executeQuery(sql);
// 5. 處理結果集
while (rs.next()) {
System.out.println(rs.getString("username") + " " + rs.getInt("password"));
}
// 6. 關閉 ResultSet
rs.close();
// 7. 關閉 Statement
stmt.close();
// 8. 關閉 Connection (最外層 finally 確保釋放)
conn.close();
executeQuery() 返回 ResultSet,游標初始在第一行之前,next() 移動到下一行並返回是否有數據。ResultSet、Statement、Connection 皆為 JVM 外部資源,**必須在 finally 塊中顯式關閉**,防止連線洩漏。try-with-resources (Java 7+) 自動關閉資源。executeUpdate(sql),返回受影響行數(int)。ResultSet,流程簡化為:連線 → Statement → executeUpdate → 關閉資源。事務:一組原子性操作,要麼全成功,要麼全失敗。經典場景:轉賬。
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, pass);
conn.setAutoCommit(false); // 關閉自動提交,開啟事務
// 扣款
stmt = conn.createStatement();
stmt.executeUpdate("UPDATE account SET money=money-100 WHERE code='100001'");
// 入款
stmt.executeUpdate("UPDATE account SET money=money+100 WHERE code='100002'");
conn.commit(); // 全部成功,提交事務
} catch (SQLException e) {
if (conn != null) conn.rollback(); // 任一失敗,回滾
e.printStackTrace();
} finally {
// 關閉資源...
}
| 方法 | 說明 |
|---|---|
| setAutoCommit(false) | 關閉自動提交,手動控制事務邊界 |
| commit() | 提交事務,持久化所有更改 |
| rollback() | 回滾事務,撤銷所有未提交更改 |
PreparedStatement 防 SQL 注入、利用預編譯提升性能。rollback() 並記錄日誌,便於問題追蹤。