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

JDBC 批次處理三大模式實戰:PreparedStatement 參數化、混合模式與 Statement 靜態 SQL 效能優化

     編輯:Java 相關知識

詳細比較 JDBC 批次處理的三種寫法:純參數化、混合參數化與靜態 SQL、純靜態 SQL,並說明 executeBatch 不支援 SELECT 語句的限制。

三種批次模式

1. 純參數化 (PreparedStatement)

String sql = "insert into testdb.book (kind, name) values (?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "java"); pstmt.setString(2, "jjjj"); pstmt.addBatch();
pstmt.setString(1, "ccc");  pstmt.setString(2, "dddd"); pstmt.addBatch();
pstmt.executeBatch();

2. 混合模式 (參數化 + 靜態 SQL)

PreparedStatement pstmt = conn.prepareStatement(sql);
// ... 參數化 addBatch() 兩次 ...
pstmt.addBatch("update testdb.book set kind = 'JAVA' where kind='java'"); // 靜態 SQL
pstmt.executeBatch();

3. 純靜態 SQL (Statement)

Statement stmt = conn.createStatement();
stmt.addBatch("insert into testdb.book (kind, name) values ('java', 'java in action')");
stmt.addBatch("insert into testdb.book (kind, name) values ('c', 'c in action')");
stmt.addBatch("delete from testdb.book where kind ='C#'");
stmt.addBatch("update testdb.book set kind = 'JAVA' where kind='java'");
// stmt.addBatch("select count(*) from testdb.book"); // 錯誤:不支援 SELECT
stmt.executeBatch();

關鍵限制

java.sql.BatchUpdateException: Can not issue SELECT via executeUpdate().
 at com.mysql.jdbc.StatementImpl.executeBatch(StatementImpl.java:1007)

executeBatch() 僅支援 DML (INSERT/UPDATE/DELETE) 與 DDL,不支援查詢語句。

效能建議

  • 大量同結構資料寫入 → 使用 PreparedStatement 參數化批次 (預編譯一次,重複執行)。
  • 需混合不同 SQL 類型 → 混合模式 仍可減少網路往返。
  • 一次性執行多條固定 SQL (如初始化腳本) → Statement 靜態批次。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved