首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >批更新与IN (x,x,x)

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

Stack Overflow用户
提问于 2015-03-30 19:48:53
回答 1查看 529关注 0票数 2

我需要为ids列表创建一个字段的更新。此列表的大小是可变的。

我想知道的是,接下来的两个可能的选择是更好的:

备选方案1:批量更新:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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。

那么,有什么选择更好呢?如果是第二种情况,我怎样才能避免SQL注入?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-30 20:20:59

选项1非常优雅,但是使用选项2,您将有更好的性能(如果参数的数量在某个时候变大的话)。只需添加与IN参数相同的IN参数needed...then循环并设置它们即可。不要在IN子句中将值设置为-is,使用参数化的方式(与?相关的东西)。

甚至有两个循环将是(方式!)比对数据库执行相同数量的查询更快。此外,虽然如果您使用的是PreparedStatement,那么您将一次性执行批处理中的所有查询,但数据库服务器将执行与生成的批处理语句数量相同的UPDATE查询。另一点是事务,这取决于你是决定全部还是不做,但无论如何,这会增加更多的时间。你可以同时测量这两种解决方案。

注意:--我在StackOverflow中看到了许多答案,它们指出,有几个?不作为IN子句的参数工作……至少对于使用JDBC4.0的DB2、Oracle和MySQL来说并非如此。确实很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29354960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档