JDBC (Java DataBase Connectivity) 是 Sun 定義的統一 Java 操作資料庫規範。驅動程式實作了標準介面,隱藏廠商細節,實現「做什麼」與「怎麼做」分離。核心四步驟:載入驅動 → 建立連線 → 執行 SQL → 釋放資源。
mysql-connector-java),換資料庫需改碼重編譯。Class.forName("com.mysql.jdbc.Driver"); // 僅需字串,零依賴驅動 JAR 編譯期
getConnection(url, user, pwd):取得 Connection。jdbc:mysql://host:port/db?key=value,常用參數 useUnicode=true&characterEncoding=UTF-8。| 方法 | 用途 |
|---|---|
createStatement() | 建立 Statement 物件 |
prepareStatement(sql) | 建立 PreparedStatement(預編譯) |
prepareCall(sql) | 建立 CallableStatement(預存程序) |
setAutoCommit(boolean) | 設定事務自動提交 |
commit() / rollback() | 手動提交/回滾事務 |
原則: 盡量晚建立、盡量早關閉,關閉代碼置於 finally 區塊。
executeQuery(sql):查詢,回傳 ResultSet。executeUpdate(sql):增刪改,回傳影響行數。addBatch/executeBatch:批次處理提升效能。TYPE_FORWARD_ONLY),next() 移動游標。Statement stmt = conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, // 可捲動,不感知底層變更
ResultSet.CONCUR_UPDATABLE // 可更新
);
常用:previous(), absolute(row), beforeFirst(), afterLast(), updateRow()。
? 佔位符,setXxx(index, value) 綁定,驅動自動轉義。String sql = "INSERT INTO users(name, age) VALUES(?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "Tom");
ps.setInt(2, 25);
ps.executeUpdate();
public class JdbcDemo {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8",
"root", "123456");
String sql = "SELECT id, username FROM users WHERE age > ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, 18);
rs = ps.executeQuery();
while (rs.next()) {
System.out.println(rs.getInt("id") + " - " + rs.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
closeQuietly(rs);
closeQuietly(ps);
closeQuietly(conn);
}
}
static void closeQuietly(AutoCloseable c) {
if (c != null) try { c.close(); } catch (Exception ignored) {}
}
}
conn.setAutoCommit(false) → 業務邏輯 → commit() / rollback()。setFetchSize、流式讀取 ResultSet、批次 executeBatch。