mybatis批量更新数据如何实现?实现方式是怎样的?

KLQ 2020-05-11 10:07:01 java常见问答 9228

你知道mybatis批量更新数据应该要怎样才能够实现吗?具体的操作方法是怎样的呢?下面就一起来具体的了解一下吧!

一、mybatis批量更新数据

1、首先是Sql批量更新

下面让我们一起来看一下在mybatis当中是怎样写的吧!

<update id="updateBatch" parameterType="java.util.List">
    update table_name
    set  status=
    
    <foreach collection="list" item="item" index="index" 
        separator=" " open="case ID" close="end">
        when #{item.id} then #{item.status}
    </foreach>
    where id in
    
    <foreach collection="list" index="index" item="item" 
        separator="," open="(" close=")">
        #{item.id,jdbcType=BIGINT}
    </foreach>
</update>

在这当中,when…then…是sql中的switch语法。

这里的话借用了mybatis语法来拼凑成了批量更新的sql。

上面的意思指的就是,批量更新id在updateBatch参数所传递List中的数据的status字段。

除此之外,我们还可以使用实现同样的功能。

代码:

<update id="updateBatch" parameterType="java.util.List">
        update mydata_table
        
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="status =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                     when id=#{item.id} then #{item.status}
                </foreach>
        </trim>
    </trim>
        where id in
        
    <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item.id,jdbcType=BIGINT}
        </foreach>
</update>

mybatis批量更新数据

上面的代码转化成了sql就像下面的:

update mydata_table 
set status = 
case
    when id = #{item.id} then #{item.status}//此处应该是
<foreach>展开值
    ...
end
where id in (...);

注意了,这是最简单的批量更新的实现。

有的时候,我们可能会需要更新多个字段,那么就要如下:

<trim prefix="status =case" suffix="end,">
    <foreach collection="list" item="item" index="index">
          when id=#{item.id} then #{item.status}
     </foreach>
</trim>

复制拷贝多次,更改prefix和when…then…的内容就可以啦!

但是,当你需要为某个字段设置默认值的时候,那么我们可以使用else。

<trim prefix="status =case" suffix="end,">
    <foreach collection="list" item="item" index="index">
        when id=#{item.id} then #{item.status}
   </foreach>
   else default_value

</trim>

还有一种,非常普遍的情况就是,需要对要更新的数据进行判断。

只有符合了条件的数据才可以进行更新,那么这样的情况下我们可以进行以下的操作:

<trim prefix="status =case" suffix="end,">
    <foreach collection="list" item="item" index="index">
        <if test="item.status !=null and item.status != -1">
         when id=#{item.id} then #{item.status}
     </if>
    </foreach>
</trim>

那么这样的话,就只有要更新的list中status != null && status != -1的数据才能进行status更新。

其他的将会使用默认值更新,而不会说保持原数据不发生改变。

那么要是要保持原数据不变呢?

<trim prefix="status =case" suffix="end,">
    <foreach collection="list" item="item" index="index">
        <if test="item.status !=null and item.status != -1">
        when id=#{item.id} then #{item.status}
    </if>
        <if test="item.status == null or item.status == -1">
        when id=#{item.id} then mydata_table.status      //这里就是原数据
    </if>
    </foreach>
</trim>

整体批量更新,代码如下:

<update id="updateBatch" parameterType="java.util.List">
    update mydata_table
    
    <trim prefix="set" suffixOverrides=",">
        <trim prefix="status =case" suffix="end,">
            <foreach collection="list" item="item" index="index">
                <if test="item.status !=null and item.status != -1">
                     when id=#{item.id} then #{item.status}
                 </if>
                <if test="item.status == null or item.status == -1">
                     when id=#{item.id} then mydata_table.status//原数据
                 </if>
            </foreach>
        </trim>
    </trim>
    where id in
    
    <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
        #{item.id,jdbcType=BIGINT}
    </foreach>
</update>

这样子的批量更新数据库的方法能够在一次数据库连接当中,将所有的数据进行更新,它避免了频繁数据库建立和断开连接的开销,能够非常高效率的提高数据更新效率。

可是,这样的方式,假如是这个过程当中,更新出现了错误,那么我们将会非常难以知道,究竟是哪里出现了错误,假如使用数据自身的事务保证,那么一旦出错,所有的更新将自动回滚。

并且,通常情况下,这样的方法也非常容易出错。

所以通常的使用的方案是进行折中,也就是一次批量更新一部分,这样可以分担出错的概率,也更容易定位到出错的位置。

以上就是对于mybatis批量更新数据的简单介绍了,你都明白了吗?

欢迎继续关注本站,有更多关于java架构师的内容可以给大家分享。

推荐阅读:

mybatis批量查询如何实现?mybatis批量删除如何实现?

mybatis优缺点是什么?有哪些优点和缺点?

mybatis是什么?功能架构有哪些?