我正在尝试使用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/