JDBC (Java Database Connectivity) 是 Java 訪問關係型數據庫的標準 API。本文以 MySQL 為例,涵蓋驅動安裝、連接建立、Statement/PreparedStatement 增刪改查、資源關閉與異常處理。
mysql-connector-java-x.x.x.jar(Maven: mysql:mysql-connector-java)。// 1. 加載驅動 (JDBC 4.0+ 可省略,SPI 自動加載)
Class.forName("com.mysql.cj.jdbc.Driver"); // 8.0+ 驅動類名
// 2. 建立連接
String url = "jdbc:mysql://127.0.0.1:3306/mydb?useSSL=false&serverTimezone=UTC";
Connection conn = DriverManager.getConnection(url, "root", "password");
// 3. 創建 Statement
Statement stmt = conn.createStatement();
// 4. 執行 SQL
// 增刷改
int rows = stmt.executeUpdate("INSERT INTO xs VALUES ('51','aa','1011')");
// 查詢
ResultSet rs = stmt.executeQuery("SELECT * FROM xs");
// 5. 處理結果集
while (rs.next()) {
System.out.println(rs.getString(1) + "\t" + rs.getString(2));
}
// 6. 關閉資源 (逆序)
rs.close();
stmt.close();
conn.close();
public class JdbcDemo {
static final String URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
static final String USER = "root";
static final String PASS = "123456";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(URL, USER, PASS)) {
// 建表
try (Statement st = conn.createStatement()) {
st.execute("CREATE TABLE IF NOT EXISTS student (id INT PRIMARY KEY, name VARCHAR(20), age INT)");
}
// 插入 (PreparedStatement 防注入)
String sql = "INSERT INTO student VALUES (?, ?, ?)";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, 1); ps.setString(2, "張三"); ps.setInt(3, 20);
ps.addBatch();
ps.setInt(1, 2); ps.setString(2, "李四"); ps.setInt(3, 21);
ps.addBatch();
ps.executeBatch();
}
// 查詢
try (Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM student")) {
while (rs.next()) {
System.out.printf("ID:%d Name:%s Age:%d%n", rs.getInt("id"), rs.getString("name"), rs.getInt("age"));
}
}
// 更新
try (PreparedStatement ps = conn.prepareStatement("UPDATE student SET age=? WHERE id=?")) {
ps.setInt(1, 22); ps.setInt(2, 1);
ps.executeUpdate();
}
// 刪除
try (PreparedStatement ps = conn.prepareStatement("DELETE FROM student WHERE id=?")) {
ps.setInt(1, 2);
ps.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
addBatch/executeBatch。Connection/Statement/ResultSet,防洩漏。conn.setAutoCommit(false) → 多條 SQL → conn.commit() / conn.rollback()。com.mysql.cj.jdbc.Driver,舊版 com.mysql.jdbc.Driver 已棄用。