@Author Jacky Wang
在使用Mybatis进行批量插入与更新的时候,遍历一条条的操作效率太低,因此采用mybatis的动态sql实现批量操作。
1. mybatis批量插入
示例如下:
这里有个注意点:
括号的分隔不能在<foreach>标签里面使用close与open使用。
<insert id="batchAddTagBindingRecord" parameterType="java.util.List" useGeneratedKeys="true">
insert t_tag_binding (goods_id,status,epc,tid,op_scene,origin_id,create_date,creater,client_id)values
<foreach collection="list" item="item" index="index" separator=",">
( #{item.goodsId,jdbcType=BIGINT},
#{item.status,jdbcType=VARCHAR},
#{item.epc,jdbcType=VARCHAR},#{item.tid,jdbcType=VARCHAR},
#{item.opScene,jdbcType=VARCHAR},#{item.originId,jdbcType=BIGINT},
#{item.createDate,jdbcType=TIMESTAMP},#{item.creater,jdbcType=BIGINT}, #{item.clientId,jdbcType=BIGINT}
)
</foreach>
</insert>
2. mybatis批量更新
示例如下:
MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。
注意:最外层trim不能包where条件
<update id="batchUpdateTagStatus" parameterType="java.util.List">
update t_tag
<trim prefix="set" suffixOverrides=",">
<trim prefix="goods_id = case" suffix="end,">
<foreach collection="list" item="item" index="index">
when epc=#{item.epc} then #{item.goodsId}
</foreach>
</trim>
<trim prefix="status = case" suffix="end,">
<foreach collection="list" item="item" index="index">
<if test="item.status!=null">
when epc=#{item.epc} then #{item.status}
</if>
</foreach>
</trim>
<trim prefix="last_update = case" suffix="end,">
<foreach collection="list" item="item" index="index">
<if test="item.lastUpdate!=null">
when epc=#{item.epc} then #{item.lastUpdate}
</if>
</foreach>
</trim>
</trim>
where epc in
<foreach collection="list" separator="," item="item" index="index" open="(" close=")">
#{item.epc}
</foreach>
</update>