2014-06-22 79 views
0

我想批量更新查询但是每个更新查询是不同的,但运行在同一张表上。 Where子句是相同的。使用弹簧批量更新

例如:

表:列A,B,C,d,ID

update A where ID=1 
update B,C where ID=1 
update D,B where ID=1 and so on ... (all the combinations of A,B,C,D) 

我已经研究了弹簧JDBC(的JdbcTemplate和JDBCNamedParameter)和QueryDsl但其不可能有这样的更新。

有没有其他方法可以像批处理一样进行更新?我坚持Spring-JDBC。

回答

0

你想使用一个准备好的语句传递每个更新的参数吗?如果是这样,这是不可能的批量。您可以批量处理多个语句,但是您必须创建这些语句而不使用参数的占位符。在这种情况下,您可以使用int[] JdbcTemplate.batchUpdate(String[] sql)方法(http://docs.spring.io/spring/docs/4.0.3.RELEASE/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html#batchUpdate-java.lang.String:A-)。

无法使用JDBC API对不同的预处理语句进行批处理。您可以批处理不带参数的个别语句(http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#addBatch(java.lang.String))或为预准备语句(http://docs.oracle.com/javase/7/docs/api/java/sql/PreparedStatement.html#addBatch())批量多组参数,但是对于所有参数集合,SQL语句必须相同。

您仍然可以在事务中包装多个更新调用,但会有多次往返数据库服务器。

0

你可以使用存储过程包装你的更新,然后你可以批量往返数据库。

在存储过程中,您需要根据传入的参数生成更新。因此,您可以测试null,或者为每列传递一个单独的标志。如果该标志已设置,则生成更新该列的SQL。