你知道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>
上面的代码转化成了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架构师的内容可以给大家分享。
推荐阅读: