mybaits批量更新的几种方法

更新单条

update shop_manager set marketing_category = #{marketingCategory} where id=#{id}

更新多条且条件为多值的记录

比较普通的写法是逐条更新

  • 优点:容易,不易出错,出错只影响当前行
  • 缺点:效率差,每条更新都会连接释放数据库资源。

代码示例:

<update id="updateBatch"  parameterType="java.util.List">  
    <foreach collection="list" item="item" index="index" open="" close="" separator=";">
        update shop_manager
        <set>
            marketing_category=#{item.marketingCategory}
        </set>
        where entity_id = ${item.entityId}
    </foreach>      
</update>

利用 case…when…then…end 语句

mybatis没有直接提供批量更新的语句但是我们可以利用mysql的case…when…then…end语句,如下sql:

UPDATE shop_manager
SET marketing_category = (
  CASE entity_id
  WHEN 1
    THEN 3
  WHEN 2
    THEN 4
  END
)

WHERE entity_id in(1,2)

注意没有where 会讲故事表都遍历一遍

对比下执行时间(shop_manager 表里面只有7条数据)
在这里插入图片描述
在这里插入图片描述
看到如果没有where,影响了全表的数据

上诉sql转化成mybatis语句:

    <!--批量更新-->
    <update id="updateCategoryBatch2">
        UPDATE shop_manager
        SET marketing_category =(
        CASE entity_id
        <foreach collection="list" item="entity">
            when #{entity.entityId} then #{entity.marketingCategory}
        </foreach>
        END
        ),
        op_time = #{opTime}
        WHERE entity_id in
        <foreach collection="list" item="entity" open="(" close=")" separator=",">
            <if test="entity.marketingCategory !=null">
                #{entity.entityId}
            </if>
        </foreach>
    </update>

还可以使用实现

    <!--批量更新-->
    <update id="updateCategoryBatch">
        UPDATE shop_manager
        <trim prefix="set">
            <trim prefix="marketing_category=case" suffix="end,">
                <foreach collection="list" item="entity">
                    when entity_id=#{entity.entityId} then #{entity.marketingCategory}
                </foreach>
            </trim>
        </trim>
        op_time = #{opTime}
        WHERE entity_id in
        <foreach collection="list" item="entity" open="(" close=")" separator=",">
            <if test="entity.marketingCategory !=null">
                #{entity.entityId}
            </if>
        </foreach>
    </update>

上面两种生成方式生成的slq结果是一样的。

<trim>属性说明
1.prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容
2.如果同时有prefixOverrides,suffixOverrides 表示会用prefix,suffix覆盖Overrides中的内容。
3.如果只有prefixOverrides,suffixOverrides 表示删除开头的或结尾的xxxOverides指定的内容。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值