前言
实际上,我们经常会遇到这样的需求,那就是利用Mybatis批量更新或者批量插入,但是,实际上即使Mybatis完美支持你的sql,你也得看看你说操作的数据库是否支持,而阿福,最近就遇到这样的一个坑。
问题
先带大家来看一段sql的配置,
<update id="updateAllAvailable"> <foreach collection="skuOptionList" item="item" index="index" open="" close="" separator=";"> update t_xxx <set> old_id = #{item.oldId} </set> where id = #{item.id} </foreach> </update>
看似似乎没有一点问题,这里用到了Mybatis的动态sql,实际上说白了也就是拼sql,不过这个繁杂的工作交给Mybatis帮我们去做了。可是,只要一执行就要报语法错误。调试了好久,发现只要传一个值进去就没有问题,就是list的成员只有一个。这引起了我的警觉。
解决方案
后来发现,原来mysql的批量更新是要我们主动去设置的, 就是在数据库的连接url上设置一下,加上* &allowMultiQueries=true *即可。
扩展
实际的业务系统里面oracle数据库也用的非常的多,当然,oracle数据库不需要做特殊的配置,但是相应的sql要做变化。
<update id="updateAllAvailable"> <foreach collection="skuOptionList" item="item" index="index" open="begin" close="end;" separator=";"> update t_xxx <set> old_id = #{item.oldId} </set> where id = #{item.id} </foreach> </update>
批量更新
<update id="batchUpdateRecordByKey" parameterType="java.util.List">
update ms_notice_send_record
<foreach collection="list" item="item" index="index" open="" close="" separator=";">
<set>
<if test="item.status != null">
`status` = #{item.status}
</if>
</set>
where id = #{item.id}
</foreach>
</update>
批量添加
<insert id="batchInsertSection" parameterType="list">
insert into kc_week_pitch_number (week_id, course_id, course_date, section_number, section_start_time, section_end_time,
create_time, update_time)
values
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.weekId},
#{item.courseId},
#{item.courseDate},
#{item.sectionNumber},
#{item.sectionStartTime},
#{item.sectionEndTime},
#{item.createTime},
#{item.updateTime}
)
</foreach>
</insert>
批量删除
<delete id="batchDeleteRelation" parameterType="java.util.List">
delete from bj_teacher_relation_class where id in
<foreach collection="list" item="item" index="index" open="(" separator="," close=")">
#{item.id}
</foreach>
</delete>