在批处理中使用JDBC preparedStatement

Bor*_*s C 17 java jdbc batch-file prepared-statement

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

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

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

where sttmnt类型的类成员Statement.

我想要做的是使用preparedStatementsetString(int, String)方法来设置一些动态的数据,然后将其添加到批处理.

不幸的是,我不完全了解它是如何工作的,以及如何我可以使用setString(int, String)到特定的SQL批处理或创建一个新preparedStatemnt的每个SQL我有,然后将它们全部加入到一个批次.

有可能这样做吗?还是我真的错过了我的理解preparedStatement

San*_*rma 18

有关示例,请阅读本文档的6.1.2节.基本上,您使用相同的语句对象,并在设置所有占位符后调用批处理方法.另一个适用于任何JDBC实现的IBM DB2示例.从第二个网站:

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
} 
Run Code Online (Sandbox Code Playgroud)

  • AFAIK,没有.正如您所看到的,在`Statement`对象上调用`addBatch`,因此任何语句都会被添加到批处理中.如果您有多种类型的报表,则不再是批次; 它有点像一个剧本. (4认同)
  • 但是,如果我希望语句不同,请说INSERT,然后进行几次更新?我能这样做吗? (2认同)
  • `Statement`有一个方法`void addBatch(String sql)`,允许组装批处理(可以视为脚本) (2认同)

RMT*_*RMT 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();
}
Run Code Online (Sandbox Code Playgroud)

这将PreparedStatement使用上面显示的查询创建1.当您要插入或任何您想要的内容时,您可以遍历列表.如果你想执行你,

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


Gre*_*eek 5

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

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

我将参数添加rewriteBatchedStatements=true到我的jdbc url中,并看到了显着的改进-在我的情况下,从125毫秒开始的200次插入操作已完成。不带参数的时间约为10至15毫秒。与参数。

请参阅带有rewriteBatchedStatements = true的MySQL和JDBC