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

JDBC 快速入門:原生 API 核心流程、連接池演進與最佳實踐

     編輯:Java 綜合教學

JDBC 核心架構

JDBC (Java DataBase Connectivity) 定義統一接口,各數據庫廠商實現驅動:

  • java.sql、javax.sql:核心接口包
  • 驅動 JAR:如 mysql-connector-java、postgresql、ojdbc

原生 JDBC 核心步驟

public class JdbcDemo {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        
        try {
            // 1. 加載驅動(JDBC 4.0+ 可省略,SPI 自動加載)
            Class.forName("com.mysql.jdbc.Driver");
            
            // 2. 建立連接
            String url = "jdbc:mysql://localhost:3306/java?useUnicode=true&characterEncoding=UTF-8";
            conn = DriverManager.getConnection(url, "root", "root");
            
            // 3. 創建語句對象
            stmt = conn.createStatement();
            
            // 4. 執行查詢
            rs = stmt.executeQuery("SELECT * FROM user");
            
            // 5. 處理結果集
            while (rs.next()) {
                String username = rs.getString("username");
                System.out.println(username);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 6. 關鍵:逆序關閉資源
            closeQuietly(rs);
            closeQuietly(stmt);
            closeQuietly(conn);
        }
    }
    
    static void closeQuietly(AutoCloseable c) {
        if (c != null) try { c.close(); } catch (Exception ignored) {}
    }
}

關鍵接口說明

接口職責核心方法
Driver驅動註冊connect()、acceptsURL()
Connection數據庫會話createStatement()、prepareStatement()、commit()/rollback()、setAutoCommit()
Statement靜態 SQL 執行executeQuery()、executeUpdate()、execute()
PreparedStatement預編譯 SQL(防注入)setXxx(index, val)、executeQuery()/Update()
ResultSet結果集游標next()、getXxx(columnIndex/Name)、getMetaData()

PreparedStatement 防注入示例

String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
try (Connection conn = DriverManager.getConnection(url, user, pwd);
     PreparedStatement ps = conn.prepareStatement(sql)) {
    ps.setString(1, username);
    ps.setString(2, password);
    try (ResultSet rs = ps.executeQuery()) {
        if (rs.next()) { /* 登錄成功 */ }
    }
}

事務管理

conn.setAutoCommit(false);
try {
    stmt.executeUpdate("UPDATE account SET balance = balance - 100 WHERE id = 1");
    stmt.executeUpdate("UPDATE account SET balance = balance + 100 WHERE id = 2");
    conn.commit();
} catch (Exception e) {
    conn.rollback();
    throw e;
} finally {
    conn.setAutoCommit(true);
}

連接池演進必要性

  1. 頻繁創建銷毀連接:TCP 握手、認證、資源分配開銷大
  2. 連接數不可控:併發高時耗盡數據庫連接數限制
  3. 無狀態監控:無法感知連接泄漏、空閒超時、有效性驗證

主流連接池對比

HikariCP 核心配置

spring.datasource.hikari:
  maximum-pool-size: 20
  minimum-idle: 5
  idle-timeout: 300000
  connection-timeout: 30000
  max-lifetime: 1800000
  connection-test-query: SELECT 1
  pool-name: MyAppPool

最佳實踐總結

  1. 始終使用 PreparedStatement 防 SQL 注入
  2. 資源關閉使用 Try-with-resources (Java 7+) 或工具類
  3. 生產環境必須使用連接池
  4. 合理設置事務邊界,避免長事務鎖表
  5. 批量操作使用 addBatch()/executeBatch()
  6. 大字段(BLOB/CLOB)使用流式讀寫
  7. 啟用慢 SQL 監控(Druid/HikariCP + p6spy)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
連接池特點推薦場景
HikariCP極致性能、輕量、零依賴、Spring Boot 2 默認所有新項目首選
Druid阿里出品、強大監控、SQL 防火牆、日誌分析需要詳細監控、SQL 分析的企業級應用
C3P0老牌、配置豐富、性能一般維護老項目
DBCP2Apache Commons、Tomcat 默認Tomcat 容器管理數據源