在批处理中使用 JDBC 预处理语句

2022-09-01 20:40:12

我使用s批处理来查询我的数据库。Iv'e现在做了一些研究,我想重写我的应用程序来代替使用,但我很难弄清楚如何将查询添加到批处理中。StatementpreparedStatementpreparedStatement

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

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

其中 是 类型的类成员。sttmntStatement

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

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

有可能做到这一点吗?还是我真的错过了我理解中的一些东西?preparedStatement


答案 1

有关示例,请阅读本文档的第 6.1.2 节。基本上,您使用相同的语句对象,并在设置完所有占位符后调用 batch 方法。另一个 IBM DB2 示例,它应该适用于任何 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
} 

答案 2

使用 's,您在某种程度上拥有通配符,例如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)

推荐