请问,怎样规避在foreach中操作数据库,或者批量查询

把数据库操作放在循环之外,基本原则。任何时候都不要选择循环处理持久化,除非业务需要。而且优秀的代码,连对象的创建都应该在循环之外的。举个例子for(x:y){ new对象}这就代表,你有多少次循环就要创建多少个对象。最佳的方式应该是new 对象afor(x:y){ a=指向对象}用类似的思路来处理数据库操作比如拼接sql stringbuffer sql = new stringbuffer();sql.append("select * from xx where xx.x in(");for(x:y){ sql .append(x+“,”)}sql.append(")");这就是一个in查询,或者你创建多个insert语句,使用批量执行方法一次提交。使用类似的思路,确保只执行一次就可以了。pad打字,格式随手敲的,你自己补充========更新跟详细的优化规则和思路,看 @Lance Zhang的答案。我仍然建议你使用basedao的方式,然后尽量使用模板方法批处理,不要自写循环持久化。
■网友
贾俊俊 答案里面for里面new对象的那个例子是错的最佳的方式应该是new 对象afor(x:y){a=指向对象}这样写,for外面new对象没意义,按照一般逻辑而言,里面引用的对象实际上还是每次循环不同(一般都是new出来);其实想要完全避免在循环里面访问数据库基本做不到,这跟业务逻辑有关系,不同情况有不同的优化方式,下面写几个常见情况1.获取一个表,再遍历获取子表写多表关联,一次把父子表数据都取出来;如果子表数据很多重复,可以使用一个map存放所有已经获取过的子表数据,用主键作为key,这样可以避免获取重复数据;如果子表数据很少更新,直接在获取子表的方法做缓存;2.循环插入n行数据使用batchupdate做优化3.非常复杂的n表查询,表数据非常多这种情况下,多表关联反而不一定好,一般在定时任务之类对响应时间要求不高的场合,适当在循环里面去访问数据库反而更好4.传入一个主键list,获取对应行贾俊俊 答案中的做法,循环拼接sql,但要注意sql注入问题,建议使用mybatis等orm工具绑定多个变量oracle in 的数量限制或者mysql的sql长度限制,这个可以有很多解决方法,比如换成or、使用临时表等,不过还是应该尽量避免list过大的问题
■网友
其实各主流php框架都有这些细节的处理,国内yii用的多的话看文档呗:http://www.yiichina.com/doc/guide/2.0/db-active-record拉到下面with语法,具体sql细节就是一次拿节约tcp来回消耗呗。
■网友
改sql语句 where column_name in (),dao层通常会提供几个xxxByIds的接口,都是可以用来做批量操作的。


    推荐阅读