本文完整示範如何使用 JDBC (Java Database Connectivity) 連接 MySQL 資料庫,涵蓋驅動載入、連線建立、Statement/PreparedStatement 操作、結果集處理、資源關閉與完整的 Maven 專案結構範例。
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId> <!-- 8.0+ 使用此坐標 -->
<version>8.0.33</version>
</dependency>
Class.forName("com.mysql.cj.jdbc.Driver"); // 8.0+ 驅動類名
// 舊版:com.mysql.jdbc.Driver
String url = "jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC&characterEncoding=utf8";
String user = "root";
String pwd = "your_password";
Connection conn = DriverManager.getConnection(url, user, pwd);
關鍵 URL 參數:
useSSL=false:本地開發關閉 SSL 避免警告serverTimezone=UTC:解決時區差異導致的時間錯誤characterEncoding=utf8:指定字符編碼allowPublicKeyRetrieval=true:MySQL 8.0+ caching_sha2_password 認證需求優點: 防 SQL 注入、預編譯效能更好、支援批次操作。
// 插入
String sql = "INSERT INTO stu(name, age, xuehao) VALUES (?, ?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, "XiaoMing");
ps.setInt(2, 23);
ps.setInt(3, 7);
int rows = ps.executeUpdate();
// 查詢
String qsql = "SELECT id, name, age, xuehao FROM stu";
ResultSet rs = ps.executeQuery(qsql);
List list = new ArrayList<>();
while (rs.next()) {
Stu s = new Stu();
s.setId(rs.getInt("id"));
s.setName(rs.getString("name"));
s.setAge(rs.getInt("age"));
s.setXuehao(rs.getInt("xuehao"));
list.add(s);
}
public class StudentDAO {
private DataSource dataSource; // 生產環境建議使用連線池 (HikariCP/Druid)
public StudentDAO(DataSource ds) { this.dataSource = ds; }
public void insert(Student s) throws SQLException {
String sql = "INSERT INTO stu(name, age, xuehao) VALUES (?, ?, ?)";
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, s.getName());
ps.setInt(2, s.getAge());
ps.setInt(3, s.getXuehao());
ps.executeUpdate();
}
}
public List findAll() throws SQLException {
String sql = "SELECT id, name, age, xuehao FROM stu";
List list = new ArrayList<>();
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
list.add(mapRow(rs));
}
}
return list;
}
private Student mapRow(ResultSet rs) throws SQLException {
Student s = new Student();
s.setId(rs.getInt("id"));
s.setName(rs.getString("name"));
s.setAge(rs.getInt("age"));
s.setXuehao(rs.getInt("xuehao"));
return s;
}
}
? 佔位符,拒絕字符串拼接 SQL。conn.setAutoCommit(false) → 執行多條 SQL → conn.commit() / conn.rollback()。SQLException 並轉換為業務異常,記錄完整堆棧資訊。public class Student implements Serializable {
private Integer id;
private String name;
private Integer age;
private Integer xuehao;
// 全欄位構造器、無參構造器、getter/setter、toString()
}