MyBatis foreach小记—— 批量update

经常会用到mybatis的foreach标签来做循环操作,可以做一些sql的拼装等,标签的属性如下:

collection 循环对象集合;
item 每个迭代对象的别名;
index 迭代索引值;
open 循环语句的开始内容;
separator 每次迭代之间的分隔符;
close 循环语句的结束内容;
    以mysql为例,批量操作的sql最常见就是通过in语句、批量insert语句等:

1, delete from table where key in(key1,key2,key3...);
2, update table set ... where id in(id1,id2,id3...); 
3, insert into table(column1,column2...) values (value1-1,value1-2...),(value2-2,value2-2...);

    批量操作的sql还有很多其他的,不同数据库的对应的实现可能也不太相同,但是对于mybatis来说,最终的原则就是:

    "批量操作的sql命令要是一条SQL"

    对于批量更新应该怎么做呢?,比如有如下形式的sql:    

update table set index=0 where id=100;
 
update table set index=1 where id=101;
    下面这种方式就会报错:

<update id="sortBatch" parameterType="java.util.List">
  <foreach item="id" collection="ids" separator=";" index="index">
    update table set index=#{index}
    where id = #{id};
  </foreach>
</update>
   多个uodate语句用分号“;”分割开,这样是不行的,要变成一个sql,如下:

<update id="sortBatch" parameterType="java.util.List">
  update table set index=
  <foreach collection="ids" item="id" index="index" separator=" " open="case ID" close="end">
    when #{id} then #{index}
  </foreach>
  where ID in
  <foreach collection="ids" index="index" item="id" separator="," open="(" close=")">
    #{id}
  </foreach>
</update>
转换为in语句,同时对set值与id进行映射绑定(这个用到了mysql的case when then语句,其他数据库也有类似的语法),相当于把上边的两条sql变成了如下的sql:

update table set index = case ID when 100 then 0 when 101 then 1 end
 
where ID in (100,101);
类似的多sql批量用mybatis来做的话都可参考这种方式。
--------------------- 
作者:冥加 
来源:CSDN 
原文:https://blog.csdn.net/mingjia1987/article/details/80107524 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,可以使用foreach循环来执行批量更新操作。引用\[1\]和引用\[2\]中的代码示例展示了如何在update语句中使用foreach循环。在引用\[1\]中,使用了in子句来指定要更新的记录的条件,而在引用\[2\]中,使用了foreach循环来遍历一个列表,并在每次迭代中执行更新操作。 需要注意的是,如果要执行多个update语句,不能简单地使用分号将它们分隔开,而是需要将它们组合成一个SQL语句。引用\[3\]中的代码示例展示了如何将多个update语句组合成一个SQL语句。在这个例子中,使用了case语句来根据不同的条件更新不同的字段值,并使用in子句来指定要更新的记录的条件。 总结起来,使用foreach循环来执行批量更新操作的步骤如下: 1. 在update语句中使用foreach循环来遍历要更新的记录。 2. 使用in子句或case语句来指定更新的条件和字段值。 3. 如果要执行多个update语句,需要将它们组合成一个SQL语句。 希望这个回答对您有帮助!\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [mybatis ~ 批量更新(sql循环)update foreach](https://blog.csdn.net/zf18234031156/article/details/89399464)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MyBatis foreach小记—— 批量update](https://blog.csdn.net/mingjia1987/article/details/80107524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值