我正在尝试使用PreparedStatement批量更新,其中您获得的数据因可用数据而异。

简单的例子:

您有一个带有x和y列的表。您的inputdata是仅包含已修改列的行的表示。因此,对于第1行,您具有x ='foo';对于第2行,您具有y ='bar'。为了用PreparedStatement批处理这些,您需要一个SQL语句:“ update table where x = ?, y =?where etc”。

我正在努力解决的方法是将您没有任何值的列设置为已经存在的值,但是我不确定这是否可行。在原始SQL中,您可以编写“ update table where x = x and y ='foo'where etc”,但是我还没有找到通过设置“?”实现此目的的任何方法。参数作为对该列的引用,似乎不可能。

是否可以使用PreparedStatement处理这种情况?如果我的解释不好,我深表歉意。

最佳答案

假设要设置的值都不为空,则可以使用如下语句

update sometable set column1 = coalesce(?, column1), colum2 = coalesce(?, column2)


然后,当不应更新该值时,请使用具有适当PreparedStatement.setNull值的java.sql.Types或具有PreparedStatement.setXXX作为值的适当类型的null

如评论中所述,如果您确实需要更新为null,则可以选择使用带有前哨值的自定义函数(用于更新为null或使用当前值)。就像是:

update sometable set column1 = conditional_update(?, column1), colum2 = conditional_update(?, column2)


conditional_update类似于(使用Firebird 3 PSQL语法):

create function conditional_update(new_value varchar(500), original_value varchar(500))
  returns varchar(500)
as
begin
  if (new_value = '$$NO_UPDATE$$') then
     return original_value;
  else
     return new_value;
end


使用$$NO_UPDATE$$是不更新的标记值。该解决方案的潜在缺点是将列键入为字符串类型。您始终需要使用字符串类型(在这种情况下,我不确定是否存在支持动态参数和返回类型的数据库)。

关于java - 当要设置的列在行与行之间变化时,批量执行JDBC PreparedStatement,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58200709/

10-12 23:54