詳細比較 JDBC 批次處理的三種寫法:純參數化、混合參數化與靜態 SQL、純靜態 SQL,並說明 executeBatch 不支援 SELECT 語句的限制。
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();
PreparedStatement pstmt = conn.prepareStatement(sql);
// ... 參數化 addBatch() 兩次 ...
pstmt.addBatch("update testdb.book set kind = 'JAVA' where kind='java'"); // 靜態 SQL
pstmt.executeBatch();
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,不支援查詢語句。