前段时间遇到批量更新上千条数据的问题,如果使用for循环update数据会导致时间长效率低(因为频繁与mysql交互,耗时较长),这是一个比较常见的需求应该可以用一条sql语句解决,查找之后解决了该问题,顺便记录一下具体代码,方便以后查找顺便帮助遇到同样需求的人。
批量插入:
<insert id="insertBatch" parameterType="具体实体类"
useGeneratedKeys="true" keyProperty="xxx">
INSERT IGNORE INTO `${db_name}`.xxx(xx,xx,xx)
VALUES
<foreach collection="list" item="order" index="index" separator=",">
(#{order.name, jdbcType=VARCHAR},
xx,
xx
)
</foreach>
</insert>
批量更新:方法一:与mysql交互一次,多条sql语句
<update id="updateBatchOne" parameterType="java.util.List">
<foreach collection="list" item="order" index="index" separator=";">
UPDATE `${db_name}`.xxx
<set>
<if test="item.name !=null">
when id=#{item.id} then #{item.name}
</if>
xxx
xxx
...
</set>
WHERE transport_no = #{order.transportNo}
</foreach>
</update>
方法二:与mysql交互一次,一条sql语句
<update id="updateBatch" parameterType="java.util.List">
update `${db_name}`.xxx
<trim prefix="set" suffixOverrides=",">
<trim prefix="name=case" suffix="end,">
<foreach collection="list" item="item" index="index">
<if test="item.name!=null">
when id=#{item.id} then #{item.name}
</if>
</foreach>
</trim>
</trim>
where id in
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item.name,jdbcType=VARCHAR}
</foreach>
</update>