关于⼀些避免在for循环⾥调⽤执⾏SQL的⽅法
在开发中很多需求会让我们觉得需要在for循环⾥调⽤执⾏sql⽅法,但是在for循环⾥调⽤执⾏sql⽅法会让程序运⾏速度变的很慢,特别是在数据量极⼤的情况下,所以就需要我们优化sql,避免在for循环⾥调⽤执⾏sql⽅法,提⾼程序运⾏速度。
在开发中遇到的⽐较多的需要在for循环⾥调⽤执⾏sql⽅法的有以下⼏种情况:
1、批量查询出主表信息后,需要根据主表的某个字段(如主键)去查询附表
此时最简单的做法当然是:
for (Student stu : studentList) {
// 查询每个学⽣的成绩单
studentDao.listScos(stu);
}
但是这样会执⾏很多次sql语句,效率不⾼,如果数据量很⼤的话,等待时间会很长
所以我们可在代码中先遍历查询出来的主表信息集合,然后将需要查询的字段值拼接起来,例如要根据主表的主键studentId去查询附表的信息,就可以使⽤StringBuilder将所有studentId拼接好,再传⼊sql中:
<select id="listMdcsFundSetlsByMdtrtId" resultType="cn.hsa.dipmon.setllist.dto.MdcsFundSetlListDTO">
SELECT <include refid="mdcsFundSetlList"/>
FROM mdcs_fund_setl_list_d
WHERE VALI_FLAG = #{mdcsFundSetl.valiFlag}批量更新sql语句
<if test="mdcsFundSetl.mdtrtId != null and mdcsFundSetl.mdtrtId != ''">
AND MDTRT_ID in
<foreach collection="mdcsFundSetl.mdtrtId.split(',')" item="item" separator="," open="(" close=")" >
#{item}
</foreach>
</if>
</select>
这样就能⼀次性将所有满⾜条件的附表查询出来了
2、批量更新,条件和需要更新的值都需要从集合中的当条数据去取,且不能foreach整个更新语句时:
<update id="updateDipDiseOprnCrsp">
UPDATE dip_dise_oprn_crsp_d
<trim prefix="set" suffixOverrides=",">
<trim prefix="DISE_SCO = case" suffix="end,"> <!--修改对照病种分值-->
<foreach collection="list" item="i">
<if test="i.diseSco != null and i.diseSco != ''">
when DISE_OPRN_CRSP_ID = #{i.diseOprnCrspId} then #{i.diseSco}
</if>
</foreach>
</trim>
<trim prefix="ACT_DISE_SCO = case" suffix="end,"> <!--修改实际病种分值-->            <foreach collection="list" item="i">
<if test="i.actDiseSco != null and i.actDiseSco != ''">
when DISE_OPRN_CRSP_ID = #{i.diseOprnCrspId} then #{i.actDiseSco}                </if>
</foreach>
</trim>
<trim prefix="VALI_FLAG = case" suffix="end,"> <!--修改有效标识-->
<foreach collection="list" item="i">
<if test="i.valiFlag != null and i.valiFlag != ''">
when DISE_OPRN_CRSP_ID = #{i.diseOprnCrspId} then #{i.valiFlag}
</if>
</foreach>
</trim>
</trim>
<where>
<foreach collection="list" separator="or" item="i">
DISE_OPRN_CRSP_ID = #{i.diseOprnCrspId}
</foreach>
</where>
</update>
我在开发中遇到⽐较多的是这两种情况,后续遇到再进⾏补充…

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。