首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JDBC 核心七步曲與最佳實踐:從 DriverManager 到連線池的進化之路

     編輯:Java 綜合教學

標準 JDBC 七步驟

  1. 載入驅動:Class.forName("com.mysql.cj.jdbc.Driver") (JDBC 4.0+ 可省略,SPI 自動載入)
  2. 建立連線:DriverManager.getConnection(url, user, pwd)
  3. 創建 Statement:PreparedStatement 防注入、預編譯優化
  4. 綁定參數:ps.setInt(1, id)、ps.setString(2, name)
  5. 執行 SQL:executeQuery()/executeUpdate()
  6. 處理結果集:while(rs.next()) { rs.getInt(1); }
  7. 釋放資源:try-with-resources 自動關閉 (JDK 7+)

現代化封裝範例

public class DBHelper implements AutoCloseable {
    private static final String URL = "jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC";
    private static final String USER = "root";
    private static final String PASS = "123456";
    
    private final Connection conn;
    private final PreparedStatement ps;
    
    public DBHelper(String sql) throws SQLException {
        this.conn = DriverManager.getConnection(URL, USER, PASS);
        this.ps = conn.prepareStatement(sql);
    }
    
    public PreparedStatement getStatement() { return ps; }
    public ResultSet executeQuery() throws SQLException { return ps.executeQuery(); }
    public int executeUpdate() throws SQLException { return ps.executeUpdate(); }
    
    @Override
    public void close() {
        try { if (ps != null) ps.close(); } catch (SQLException ignore) {}
        try { if (conn != null) conn.close(); } catch (SQLException ignore) {}
    }
}

// 使用範例
try (DBHelper db = new DBHelper("SELECT * FROM user WHERE age > ?")) {
    db.getStatement().setInt(1, 18);
    try (ResultSet rs = db.executeQuery()) {
        while (rs.next()) {
            System.out.printf("ID:%d Name:%s Age:%d%n", 
                rs.getInt("id"), rs.getString("name"), rs.getInt("age"));
        }
    }
}

進階必知:連線池

生產環境嚴禁逐請求建立連線。主流選擇:

  • HikariCP:Spring Boot 2.x 預設,效能最強
  • Druid:阿里出品,監控功能豐富
  • DBCP2 / c3p0:較舊專案常見
# HikariCP 核心配置 (application.yml)
spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      idle-timeout: 300000
      connection-timeout: 30000
      max-lifetime: 1800000
      connection-test-query: SELECT 1

常見坑位避雷

問題原因解決
連線洩漏未在 finally 關閉資源try-with-resources / 連線池自動回收
SQL 注入字串拼接 SQLPreparedStatement 參數化
事務未提交自動提交關閉後忘記 commitconn.setAutoCommit(false) + 統一 commit/rollback
時區錯誤MySQL 8.0+ 預設 UTCURL 加 serverTimezone=Asia/Taipei
大資料量 OOM一次性 fetch 所有行分頁查詢 / 流式讀取 setFetchSize()
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved