进行批量更新操作,xml文件如下:
<update id="batchUpdateByPrimaryKeySelective" parameterType="java.util.List">
<foreach collection="list" item="record" separator=";">
update qs_capital_platform_actual_repayment
<if test="record.rechargeRecordId != null">
recharge_record_id = #{record.rechargeRecordId,jdbcType=BIGINT},
</if>
<if test="record.allocatePlanId != null">
allocate_plan_id = #{record.allocatePlanId,jdbcType=BIGINT},
</if>
。。。(略)
where id = #{record.id,jdbcType=BIGINT}
</foreach>
</update>
使用这中foreach的批量操作,可以看做是好多的sql,update …;每个更新一条的sql用分号分开,然后一次拿去数据库执行,这样更新多条,其实就是一次性执行了多条sql。但是使用mysql数据库,如果没有设置数据库的配置&allowMultiQueries=true
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?userUnicode=true&allowMultiQueries=true
就会报那个错,他默认不允许一次执行多条sql。如果有时候我们没法修改数据库配置。可是使用case when的方式来批量操作。
<update id="batchUpdate" parameterType="list">
UPDATE students
<trim prefix="set" suffixOverrides=",">
<trim prefix="classno=case" suffix="end,">
<foreach collection="list" item="item" index="index">
WHEN sno=#{item.sno} THEN #{item.classno}
</foreach>
</trim>
</trim>
WHERE sno IN
<foreach collection="list" separator="," item="item" index="index" open="(" close=")">
#{item.sno}
</foreach>
</update>
prefix=“classno=case” ,classno是一个表字段,这段的意思就是根据id,更新字段classno的值,如果需要更新多个字段,下面这一段,多加几个就行了。把classno替换掉
<trim prefix="classno=case" suffix="end,">
<foreach collection="list" item="item" index="index">
WHEN sno=#{item.sno} THEN #{item.classno}
</foreach>
</trim>
这样拼装出来的sql就是下面这样
UPDATE students set classno=case WHEN sno=? THEN ? WHEN sno=? THEN ? WHEN sno=? THEN ? WHEN sno=? THEN ? WHEN sno=? THEN ? WHEN sno=? THEN ? end WHERE sno IN ( ? , ? , ? , ? , ? , ? )
这样就是只有一条sql,就不会有错了。