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

Batch update versus IN (x,x,x)

我需要为 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注入。

那么,哪个选项更好?数字 1 或数字 2。如果是数字 2,我如何避免 SQL 注入?

选项 1 更优雅,但是使用 选项 2 你会有更好的性能(如果参数的数量变成在某些时候很大)。只需添加与 IN 所需参数一样多的 ? ......然后再次循环并设置它们。不要在 IN 子句中按原样设置值 ,使用参数化的 fashion? ).

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

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