015MyBatis中foreach用法

本文详细介绍了MyBatis中foreach元素的使用,包括在select、insert和update语句中的应用。foreach支持collection、index、item、open、close和separator等属性,可用于遍历集合并构建动态SQL。示例展示了如何通过foreach实现批量插入和更新操作,甚至处理复杂的动态SQL,如利用case函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

foreach元素主要用于对一个集合(List、Set、Map、数组)进行遍历
foreach支持如下属性
collection:指定要遍历的集合
【也就是传过来的参数,但是不能用param和arg0,要么注解指定参数名。要么用默认的参数名list/set/map/array,当然这个时候的参数只有一个】
index: 在map中代表key,其他集合可以不用指定
item:在map中代表value,其他集合代表当前遍历的元素,充当变量
open:循环开始处放置的字符串
close:循环结束出放置的字符串
separator:每次迭代之间的分隔符
tips:上述属性中最后三个属性与trim元素中的属性一致

select中使用foreach

查询news_id 在数组范围内的记录

<select id="queryNews" databaseId="mysql" resultMap="newsMapper">
        select * from news_inf where news_id in
<foreach collection="arr" item="item"  open="(" separator="," close=")">
        #{item}
 </foreach>
newsMapper.queryNews(new int[]{1,3});

insert中使用foreach(批量插入)

<insert id="insertNews" databaseId="mysql" >
   insert into news_inf values
<foreach collection="list" item="news" separator=",">
   (#{news.id},#{news.title},#{news.content},#{news.status})
</foreach>
</insert>
 var news1 = new News(null,"title1","content1",null);
        var news2 = new News(null,"title2","content2","ACTIVE");
        var news3 = new News(null,"title3","content3","LAZY");
var list = new ArrayList<News>();
list.add(news1);
list.add(news2);
list.add(news3);
int i = newsMapper.insertNews(list);

update中使用foreach(批量更新)

  <update id="updateNews" databaseId="mysql" >
        update news_inf
<set>
   <foreach collection="list" item="news" open="news_title=case" close="end," separator=" ">
       <if test="news.title != null">
           when news_id = #{news.id} then #{news.title}
       </if>
   </foreach>
   <foreach collection="list" item="news" open="news_content=case" close="end" separator=" ">
       <if test="news.content != null">
           when news_id = #{news.id} then #{news.content}
       </if>
   </foreach>
</set>
   <where>
       news_id in (1,2,3)
   </where>
</update>
News news1 = new News(1,"标题1","内容1",null);
News news2 = new News(2,"标题2","内容2",null);
News news3 = new News(3,"标题3","内容3",null);
var list = new ArrayList<News>();
list.add(news1);
list.add(news2);
list.add(news3);
var i = newsMapper.updateNews(list);

最后一个例子稍微复杂点,其中利用了case函数,说明了foreach可以灵活的完成一些复杂的动态sql语句

### MyBatis 中 `foreach` 标签用于批量更新 在 MyBatis 中,可以利用 `<foreach>` 标签实现批量更新操作。这通常涉及到构建动态 SQL 来处理多个记录的同时修改。 对于批量更新而言,SQL 的结构会有所不同,主要体现在如何构造 SET 子句以及 WHERE 条件来匹配要更新的目标行。下面是一个具体的例子展示怎样通过传递列表对象来进行批量更新: ```xml <update id="batchUpdateUsers"> UPDATE user u, <foreach collection="list" item="userItem" index="index" separator="," open="(" close=")"> (#{userItem.id,jdbcType=BIGINT}, #{userItem.username,jdbcType=VARCHAR}, #{userItem.password,jdbcType=VARCHAR}, #{userItem.age,jdbcType=TINYINT}) as temp_user(id,username,password,age) </foreach> SET u.username = CASE <foreach collection="list" item="userItem" index="index" separator="WHEN"> WHEN u.id=#{userItem.id,jdbcType=BIGINT} THEN #{userItem.username,jdbcType=VARCHAR} </foreach> END, u.password = CASE <foreach collection="list" item="userItem" index="index" separator="WHEN"> WHEN u.id=#{userItem.id,jdbcType=BIGINT} THEN #{userItem.password,jdbcType=VARCHAR} </foreach> END, u.age = CASE <foreach collection="list" item="userItem" index="index" separator="WHEN"> WHEN u.id=#{userItem.id,jdbcType=BIGINT} THEN #{userItem.age,jdbcType=TINYINT} </foreach> END WHERE u.id IN ( <foreach collection="list" item="userItem" index="index" separator="," open="(" close=")"> #{userItem.id,jdbcType=BIGINT} </foreach>) </update> ``` 上述代码片段展示了如何使用 `<foreach>` 构建复杂的批处理语句[^1]。这里的关键在于理解如何将输入集合中的每一项映射到相应的列上,并确保只有当 ID 匹配时才会应用新的值给对应的字段。 值得注意的是,在实际项目开发过程中可能还需要考虑数据库性能优化等问题,比如分批次提交事务以减少锁表时间等措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值