gpt4 book ai didi

java - 当要设置的列因行而异时,批量使用 JDBCPreparedStatement

转载 作者:行者123 更新时间:2023-12-01 19:34:54 25 4
gpt4 key购买 nike

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

简单的例子:

您有一个包含 x 列和 y 列的表。您的输入数据是仅存在修改后的列的行的表示。因此,对于第 1 行,您有 x='foo',对于第 2 行,您有 y='bar'。为了使用PreparedStatement对这些进行批处理,您需要一个SQL语句:“update table where x=?,y=? where etc”。

我正在努力的解决方案是将没有任何值的列设置为已存在的值,但我不确定这是否可能。在原始 SQL 中,您可以编写“更新表,其中 x=x 和 y='foo' 等”,但是我还没有找到任何方法通过设置“?”来实现此目的。参数是对列的引用,看来这是不可能的。

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

最佳答案

假设您要设置的值都是非空的,您可以使用类似的语句

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 - 当要设置的列因行而异时,批量使用 JDBCPreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58200709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com