JDBC 核心七步驟
- 載入驅動:
Class.forName("com.mysql.jdbc.Driver") 註冊驅動到 DriverManager
- 連接 URL:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=gbk
- 建立連接:
DriverManager.getConnection(url, username, password)
- 建立 Statement:三類型對應不同場景
Statement:靜態 SQL
PreparedStatement:參數化 SQL(防注入、效能優)
CallableStatement:預存程序
- 執行 SQL:
executeQuery:查詢 → ResultSet
executeUpdate:增刪改/DDL → 影響行數
execute:複雜多結果集
- 處理結果:
ResultSet 游標遍歷,getString(int columnIndex) 比 getString(String columnName) 更高效
- 關閉資源:逆序關閉
ResultSet → Statement → Connection,各自獨立 try-catch
完整代碼範例
public class JDBCTest {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://localhost:3308/spring";
String user = "root", pass = "root";
String sql = "select * from users";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(url, user, pass);
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
System.out.println("id: " + rs.getInt(1) + " name: " + rs.getString(2) + " pwd: " + rs.getString(3));
}
} 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) {}
}
}
關鍵最佳實踐
- 優先使用
PreparedStatement 防 SQL 注入、利用預編譯提升效能
- 資源關閉採用工具方法或 try-with-resources (Java 7+) 簡化代碼
- 生產環境必須使用連接池 (HikariCP/Druid) 而非直接建立連接
- 結果集遍歷使用列索引而非列名提升效能
- 異常處理保留堆疊追蹤,避免吞沒錯誤