雖然現代開發多使用 ORM 框架(MyBatis、Hibernate、JPA),但理解 JDBC 底層原理對排查效能問題、設計連線池、處理特殊 SQL 場景至關重要。本文以最原始的 JDBC API 示範連線 MySQL、執行查詢的完整流程。
mysql-connector-java-5.1.x.jar 或 8.x 版本)Class.forName("com.mysql.cj.jdbc.Driver")(8.x 版本),舊版為 com.mysql.jdbc.Driver。DriverManager.getConnection(url, user, password),URL 格式 jdbc:mysql://host:port/dbname?useSSL=false&serverTimezone=UTC。PreparedStatement 防 SQL 注入,支援參數化查詢。executeQuery()(查詢)、executeUpdate()(增刪改)。ResultSet 逐行讀取,getString()、getInt() 等取值。finally 區塊或 try-with-resources 關閉 ResultSet、Statement、Connection。public class JdbcDemo {
private static final String URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
public static List<String> queryUserNames() {
String sql = "SELECT user_name FROM user";
List<String> names = new ArrayList<>();
try (Connection conn = getConnection();
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
names.add(rs.getString("user_name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return names;
}
public static void main(String[] args) {
List<String> list = queryUserNames();
list.forEach(System.out::println);
}
}
useSSL、serverTimezone、allowPublicKeyRetrieval)與 5.x 不同。fetchSize 或使用游標避免 OOM。