关于一些避免在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.dip.common.setllist.dto.MdcsFundSetlListDTO">
    SELECT <include refid="mdcsFundSetlList"/>
    FROM mdcs_fund_setl_list_d
    WHERE VALI_FLAG = #{mdcsFundSetl.valiFlag}
    <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>

我在开发中遇到比较多的是这两种情况,后续遇到再进行补充…


版权声明:本文为weixin_44991320原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。