mysql-批量更新

方法一:用update结合case、then实现

原始SQL语句

UPDATE baginfo_2021_09 
    SET channel_id = CASE id 
        WHEN 1 THEN 3 
        WHEN 2 THEN 4 
        WHEN 3 THEN 5 
    END, 
    stationId = CASE id 
        WHEN 1 THEN 6
        WHEN 2 THEN 7
        WHEN 3 THEN 8
    END
WHERE id IN (1,2,3)

mybatis写法

    <update id="updateBatchCaseThen" parameterType="java.util.List">
        update baginfo_2022_03
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="clientId =case" suffix="end,">
                <foreach collection="list" item="i" index="index">
                    <if test="i.clientId!=null">
                        when id=#{i.id} then #{i.clientId}
                    </if>
                </foreach>
            </trim>
            <trim prefix="model_version =case" suffix="end,">
                <foreach collection="list" item="i" index="index">
                    <if test="i.model_version!=null">
                        when id=#{i.id} then #{i.model_version}
                    </if>
                </foreach>
            </trim>
            <trim prefix="create_time =case" suffix="end,">
                <foreach collection="list" item="i" index="index">
                    <if test="i.create_time!=null">
                        when id=#{i.id} then #{i.create_time}
                    </if>
                </foreach>
            </trim>
        </trim>
        where
        <foreach collection="list" separator="or" item="i" index="index">
            id=#{i.id}
        </foreach>
    </update>

方法二:用foreach循环实现

mybatis写法

    <update id="batchUpdateBagInfo" parameterType="com.example.demo.entity.BagInfo">
        <foreach collection="list" item="item" index="index" open="" close="" separator=";">
            update baginfo_2022_03
            <set>
                <if test="item.clientId != null">
                    clientId = #{item.clientId},
                </if>
                <if test="item.model_version != null">
                    model_version = #{item.model_version},
                </if>
                <if test="item.create_time != null">
                    create_time = #{item.create_time},
                </if>
            </set>
            where id = #{item.id}
        </foreach>
    </update>

用这种方法时,yml文件中配置的数据库URL,需要加上&allowMultiQueries=true

性能比较

mysql表数据量:2000w;一次更新数据量:1000

更新方法更新总耗时
单条循环更新(for)1-3s
方法1110ms-180ms
方法2110ms-180ms

总体比较,单条循环更新最慢的,想想也知道。而方法1和方法2的耗时相差不大。更高数量的批量更新,可能会导致结果不同,这里暂时没有测试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值