JDBC (Java Database Connectivity) 是 Sun 定義的一套統一操作關係型資料庫的 API,由接口組成,具體實現由各資料庫廠商提供驅動包。本文從核心概念到完整代碼範例,手把手教你用 Java 操作 MySQL。
Class.forName("com.mysql.cj.jdbc.Driver")(8.0+)或 com.mysql.jdbc.Driver(5.x)DriverManager.getConnection(url, user, pass)conn.createStatement() 或 conn.prepareStatement(sql)executeQuery(查詢)、executeUpdate(增刪改)ResultSet.next() + getXxx()finally 區塊關閉 rs、stmt、connpackage cn.test.jdbc.dao;
import java.sql.*;
import java.util.Date;
import java.util.Properties;
import com.mysql.cj.jdbc.Driver;
public class JDBCDemo {
private static final String URL = "jdbc:mysql://localhost:3306/day15?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8";
private static final String USER = "root";
private static final String PASS = "your_password";
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 載入驅動(可選,JDBC 4.0+ 自動發現)
// Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 建立連線
conn = DriverManager.getConnection(URL, USER, PASS);
// 3. 創建 Statement
stmt = conn.createStatement();
// 4. 執行查詢
String sql = "SELECT id, name, password, email, birthday FROM student";
rs = stmt.executeQuery(sql);
// 5. 處理結果集
System.out.println("id | name | password | email | birthday");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String pwd = rs.getString("password");
String email = rs.getString("email");
Date birthday = rs.getDate("birthday");
System.out.printf("%d | %s | %s | %s | %s%n", id, name, pwd, email, birthday);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 6. 釋放資源(逆序關閉)
closeQuietly(rs);
closeQuietly(stmt);
closeQuietly(conn);
}
}
private static void closeQuietly(AutoCloseable c) {
if (c != null) try { c.close(); } catch (Exception ignore) {}
}
}
jdbc:mysql://host:port/dbname?param1=value1¶m2=value2
常用參數:
useSSL=false # 開發環境關閉 SSL
serverTimezone=UTC # 避免時區警告
characterEncoding=UTF-8 # 字符集
autoReconnect=true # 自動重連(生產慎用)
rewriteBatchedStatements=true # 批次優化
| 特性 | Statement | PreparedStatement |
|---|---|---|
| SQL 注入防護 | 無 | 參數化查詢,安全 |
| 預編譯效能 | 每次編譯 | 預編譯,重複執行快 |
| 批次處理 | addBatch/executeBatch | 同樣支援,更高效 |
| 適用場景 | 靜態 SQL、DDL | 動態參數、高頻執行 |
conn.setAutoCommit(false);
try {
stmt.executeUpdate("INSERT ...");
stmt.executeUpdate("UPDATE ...");
conn.commit();
} catch (SQLException e) {
conn.rollback();
throw e;
} finally {
conn.setAutoCommit(true);
}
next():移至下一行(初始指向第一行之前)previous()、absolute(row)、beforeFirst()、afterLast():需 TYPE_SCROLL_INSENSITIVE 或 TYPE_SCROLL_SENSITIVEPreparedStatement 參數化查詢mysql:mysql-connector-java)bind-address 非 0.0.0.0allowPublicKeyRetrieval=true(8.0+ caching_sha2_password)serverTimezone=Asia/Shanghai 或 UTC生產環境請使用連接池(HikariCP、Druid),而非手動管理連接;並配合 Spring JdbcTemplate / MyBatis 等框架簡化樣板代碼。