gpt4 book ai didi

java - 批量更新与 IN (x,x,x)

转载 作者:太空宇宙 更新时间:2023-11-04 14:00:19 26 4
gpt4 key购买 nike

我需要创建 id 列表字段的更新。该列表的大小是可变的。

我想知道的是,接下来的两个可能的选项中哪一个更好:

选项 1:批量更新:

PreparedStatement update = connection.prepareStatement(" UPDATE table set field = value where id = ?");
for (id : ids){
update.setInt(id);
update.addBatch();
}
update.executeBatch();

选项 2:IN (x,x,x)

PreparedStatement list_update = connection.prepareStatement( "UPDATE table set field = value where id in ( " + comma_separated_ids(ids) + ")" );

private String comma_separated_ids(int[] ids){
// receives [1,2,3] and returns "1,2,3"
}

我更倾向于第二种,但我不喜欢 where id in ( "+ comma_separated_ids(ids) + ")"); 因为可能存在 SQL 注入(inject)。

那么,什么选择更好呢?第 1 点或第 2 点。如果是第 2 点,我怎样才能避免 SQL 注入(inject)?

最佳答案

选项 1 相当优雅,但使用选项 2 您将获得更好的性能(如果参数数量在某个时刻变大,性能甚至会更好)。只需添加所需的 IN 参数即可...然后再次循环并设置它们。不要在 IN 子句中按原样设置值,而使用参数化的fashion(带有 ? 的东西)。

即使有两个循环也比对数据库执行相同数量的查询要快得多!此外,虽然如果您使用PreparedStatement,您将一次性执行批处理中的所有查询,但数据库服务器将执行与您构建的批处理语句数量一样多的UPDATE查询。另一点是交易全有或全无由您决定,但无论如何这都会增加一些时间。您始终可以测量这两种解决方案。

注意:我在 StackOverflow 中看到了很多答案,他们指出几个 ? 不能作为 IN 子句的参数...这不是真的,至少对于使用 JDBC 4.0 的 DB2、Oracle 和 MySQL 来说是这样。它确实有效。

关于java - 批量更新与 IN (x,x,x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29354960/

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