在批处理中使用JDBC preparedStatement

时间:2011-07-28 14:31:19

标签: java jdbc batch-file prepared-statement

我使用Statement批次来查询我的数据库。 我现在做了一些研究,我想重写我的应用程序以使用preparedStatement,但我很难弄清楚如何向preparedStatement批次添加查询。

这就是我现在正在做的事情:

private void addToBatch(String sql) throws SQLException{
sttmnt.addBatch(sql);
batchSize++;
if (batchSize == elementsPerExecute){
    executeBatches();
}
}

其中sttmntStatement类型的类成员。

我想要做的是使用preparedStatement的{​​{1}}方法设置一些动态数据,然后将其添加到批处理中。

不幸的是,我不完全理解它是如何工作的,以及如何将setString(int, String)用于批处理中的特定sql或为我拥有的每个sql创建一个新的setString(int, String)然后加入它们一到一批。

可以这样做吗?或者我在理解preparedStatemnt时真的错过了什么?

3 个答案:

答案 0 :(得分:17)

阅读section 6.1.2 of this document以获取示例。基本上,您使用相同的语句对象,并在设置所有占位符后调用批处理方法。 Another IBM DB2 example应该适用于任何JDBC实现。来自第二个网站:

try {
  connection con.setAutoCommit(false);        
  PreparedStatement prepStmt = con.prepareStatement(    
    "UPDATE DEPT SET MGRNO=? WHERE DEPTNO=?");
  prepStmt.setString(1,mgrnum1);            
  prepStmt.setString(2,deptnum1);
  prepStmt.addBatch();                      

  prepStmt.setString(1,mgrnum2);                        
  prepStmt.setString(2,deptnum2);
  prepStmt.addBatch();
  int [] numUpdates=prepStmt.executeBatch();
  for (int i=0; i < numUpdates.length; i++) {
    if (numUpdates[i] == -2)
      System.out.println("Execution " + i + 
        ": unknown number of rows updated");
    else
      System.out.println("Execution " + i + 
        "successful: " + numUpdates[i] + " rows updated");
  }
  con.commit();
} catch(BatchUpdateException b) {
  // process BatchUpdateException
} 

答案 1 :(得分:6)

对于PreparedStatement,你有一种外卡,例如

Sring query = "INSERT INTO users (id, user_name, password) VALUES(?,?,?)";
PreparedStatement statement = connection.preparedStatement(query);
for(User user: userList){
    statement.setString(1, user.getId()); //1 is the first ? (1 based counting)
    statement.setString(2, user.getUserName());
    statement.setString(3, user.getPassword()); 
    statement.addBatch();
}

这将使用上面显示的查询创建1 PreparedStatement。当您要插入或无论您想要什么时,您都可以遍历列表。如果你想执行你,

statement.executeBatch();
statement.clearBatch(); //If you want to add more, 
//(so you don't do the same thing twice)

答案 2 :(得分:3)

我在这里专门为MySQL添加了一个额外的答案。

我发现进行一批插入的时间与单个插入的时间长度相似,即使是批处理周围的单个事务也是如此。

我将参数rewriteBatchedStatements=true添加到我的jdbc网址,并看到了一个显着的改进 - 在我的情况下,一批200个插入来自125毫秒。没有参数约10至15毫秒。使用参数。

请参阅MySQL and JDBC with rewriteBatchedStatements=true