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

JDBC 資料庫操作核心流程與最佳實踐指南

     編輯:Java 程式設計入門

一、兩種連線方式

1. DriverManager 直連(簡單應用)

String url = "jdbc:oracle:thin:@localhost:1521:ora92";
String user = "scott", pwd = "tiger";
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection(url, user, pwd);

2. JNDI + DataSource(企業級標準,支援連線池)

Context ctx = new InitialContext(env); // env 含 PROVIDER_URL、INITIAL_CONTEXT_FACTORY
DataSource ds = (DataSource) ctx.lookup("jdbc/db");
Connection conn = ds.getConnection();

優勢:連線池管理、聲明式事務、應用伺服器整合、配置與代碼分離。

二、SQL 執行三大 API

介面適用場景關鍵方法
Statement靜態 SQL、無參數executeQuery()、executeUpdate()
PreparedStatement參數化 SQL、防注入、重複執行setXxx()、executeQuery/Update()
CallableStatement預存程序registerOutParameter()、execute()

PreparedStatement 範例

String sql = "INSERT INTO users(id, name) VALUES(?, ?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 1001);
ps.setString(2, "zhangsan");
int rows = ps.executeUpdate();

三、事務控制:ACID 落地

conn.setAutoCommit(false); // 關閉自動提交
try {
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    stmt.close();
    conn.commit(); // 全部成功提交
} catch (SQLException e) {
    conn.rollback(); // 任一失敗回滾
    throw e;
} finally {
    // 關閉資源(見下節)
}

四、資源關閉:防洩漏鐵律

// JDK 7+ try-with-resources(推薦)
try (Connection conn = ds.getConnection();
     PreparedStatement ps = conn.prepareStatement(sql);
     ResultSet rs = ps.executeQuery()) {
    // 業務邏輯
} // 自動關閉,即使拋出異常

// JDK 6 手動關閉模板
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
    conn = ds.getConnection();
    ps = conn.prepareStatement(sql);
    rs = ps.executeQuery();
    // 處理結果
} finally {
    closeQuietly(rs);
    closeQuietly(ps);
    closeQuietly(conn);
}
// closeQuietly 內部捕獲異常,避免掩蓋原始異常

五、完整範例:DataSource + 事務 + 資源管理

public class JdbcTemplate {
    private DataSource ds;
    public JdbcTemplate(DataSource ds) { this.ds = ds; }
    
    public void transfer(int fromId, int toId, double amount) {
        String sql1 = "UPDATE accounts SET balance = balance - ? WHERE id = ?";
        String sql2 = "UPDATE accounts SET balance = balance + ? WHERE id = ?";
        
        try (Connection conn = ds.getConnection()) {
            conn.setAutoCommit(false);
            try (PreparedStatement ps1 = conn.prepareStatement(sql1);
                 PreparedStatement ps2 = conn.prepareStatement(sql2)) {
                ps1.setDouble(1, amount); ps1.setInt(2, fromId);
                ps2.setDouble(1, amount); ps2.setInt(2, toId);
                ps1.executeUpdate();
                ps2.executeUpdate();
                conn.commit();
            } catch (SQLException e) {
                conn.rollback();
                throw new RuntimeException("Transfer failed", e);
            }
        } catch (SQLException e) {
            throw new RuntimeException("DB connection failed", e);
        }
    }
}

六、進階主題

  • 批次處理:ps.addBatch() + executeBatch() 大幅提升大量寫入效能
  • 大物件:Blob/Clob 流式讀寫,避免記憶體溢位
  • 連線池調優:最大/最小連線、取得超時、空閒驗證、洩漏偵測
  • SQL 注入防護:永遠使用 PreparedStatement,絕不拼接 SQL 字串

總結

JDBC 核心流程:獲取連線 → 建立 Statement → 綁定參數 → 執行 → 處理結果 → 釋放資源。掌握 DataSource、PreparedStatement、聲明式事務與 try-with-resources,即可寫出健壯、安全、高效的資料存取代碼。現代框架(Spring JDBC、MyBatis、JPA)皆建立在此基礎之上,理解底層機制有助於排查疑難雜症與效能調優。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved