mybatis批量更新数据库操作--两种方案的对比

批量更新数据库

方案一

在循环中创建update语句。

<update id="updateBatchById">
    <foreach collection="list" item="item" separator=";">
        update
            `t_student`
        set
            `name` = #{item.name},
            `age` = #{item.age}
        where
            id = #{item.id}
    </foreach>
</update>

这种方案的sql写起来比较方便,虽然他也只需要和数据库做一次连接,进行一次网络IO,但是数据库的服务器在执行sql的时候是需要根据“;”来区分然后一句一句执行的,所以在效率上还是不高的。
而且注意,默认情况下,数据库是不支持执行这样由";“号拼接的长串的,执行的时候会报错,提示说执行的SQL有语法错误。
我们需要通过在数据库连接URL中指定allowMultiQueries参数值为true告诉数据库以支持”;"号分隔的多条语句的执行。

spring.datasource.url=jdbc:mysql://localhost:3306/test?allowMultiQueries=true

方案二

借用case when来写一个update的sql语句。

update `t_student`
<trim prefix="set" suffixOverrides=",">
    <trim prefix=" `name` = case " suffix=" end, ">
        <foreach collection="list" item="item">
            <if test="item.name != null">
                when `id` = #{item.id} then #{item.name}
            </if>
        </foreach>
    </trim>
    <trim prefix=" `age` = case " suffix=" end, ">
        <foreach collection="list" item="item">
            <if test="item.age != null">
                when `id` = #{item.id} then #{item.age}
            </if>
        </foreach>
    </trim>
</trim>
where
    `id` in
<foreach collection="list" item="item" open="(" close=")" separator=",">
    #{item.id}
</foreach>

这种方案其实也不会不好理解,只是可读性差一点。它是通过把所有的对象遍历一遍然后获取指定的字段放进case语句中,很粗暴。这种方式编译出来就是一条sql语句,而不是第一种方案的n条语句的拼凑。
所以mybatis只要和mysql建立一次连接,同时在mysql服务器执行sql语句的时候只要执行一个in查询的sql语句。这个方案的效率明显比第一种方案要高。

测试

测试数据为六个字段的更新语句;记录数为251条。

方案一

在这里插入图片描述

方案二

在这里插入图片描述
两者相差100倍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值