Java - 如何批量数据库插入和更新

时间:2012-12-12 15:57:44

标签: java mysql database prepared-statement

我想在一个PreparedStatement中批量处理多种类型的数据库调用。这可能吗?

无论如何都要做

这样的事情

PreparedStatement pstmt = connection.prepareStatement("?");

在哪里?可以是INSERT INTO MY_TABLE VALUES(1,2,3,4),也可以是UPDATE MY_TABLE, SET MY_VAL='1' WHERE MY_VAL IS NULL

或者我是否总是需要为我准备好的声明指定一个表和操作?

3 个答案:

答案 0 :(得分:3)

Java不允许你只添加?在preparedstatement字符串参数中,正如它所期望的那样?仅适用于赋予SQL的参数的占位符。

对于您的情况,您可能必须有2个准备好的语句对象,并且在循环中,您可以决定调用哪个。所以它会像下面这样:

PreparedStatement insertPstmt = connection.prepareStatement("INSERT INTO MY_TABLE VALUES(?,?,?,?)");
PreparedStatement updatePstmt = connection.prepareStatement("UPDATE MY_TABLE, SET MY_VAL=? WHERE MY_VAL IS NULL");

While (<condition>) {
  If (<insert condition>) {
    // use insert pstmt and add batch
  } else {
    // use update pstmt and add batch
  }
}

insertPstmt.executeBatch(); 
updatePstmt.executeBatch();

如果您有任何依赖于更新的插入,则可以相应地执行批处理。这将确保更新正常运行。我会先考虑执行insert,因为它们可能不依赖于更新。

答案 1 :(得分:0)

在PreparedStatement上,在为第一次执行绑定变量之后,调用

pstmt.addBatch();

然后绑定下一个变量,每次调用addBatch()。 然后,当您完成添加批次后,您可以通过所有

执行bacth
pstmt.executeBatch();

见:

http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#addBatch%28%29

http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#executeBatch%28%29

顺便说一句:将整个法规注入变量是行不通的。这种批处理机制的存在是为了重复使用每次绑定不同变量的相同语句。

答案 2 :(得分:0)

插入和更新命令不会返回任何必须处理的数据。如果你想在你的例子中做一些事情,你可以简单地运行一个不执行的查询命令,并提供一个由分号分隔的所有sql字符串的串联字符串。

"INSERT INTO MY_TABLE VALUES(1,2,3,4)" + ";"  +"UPDATE MY_TABLE, SET MY_VAL='1' WHERE MY_VAL IS NULL" + ";" +...

在这种情况下,您无需准备声明,也不会因此而获得任何性能提升。