Mybatis: Mybatis foreach逗号分隔字符串 遍历方式

这篇博客介绍了如何在MyBatis中利用foreach标签处理前端传递的逗号分隔字符串,例如accountType和buType,直接在mapper.xml中动态构建SQL,避免了后台额外的字符串处理,提高了效率。

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

前端传递字段
accountType: a,b,c
buType: d,e
mapper:
List<DetailVO> findList(Page<DetailVO> page, @Param("q") Map<String, Object> params);

通过myBatis自带功能foreach,直接把逗号分隔的字符串传到mapper.xml即可,后台不用过多操作,Mapper.xml拼接部分sql如下:

<if test="q.buType != null and q.buType !='' ">
            and bu.bu_type in
            <foreach item="item" index="index" collection="q.buType.split(',')" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>
        <if test="q.accountType !=null and q.accountType !='' ">
            and coa.mgmt_control_category in
            <foreach item="item" index="index" collection="q.accountType.split(',')" open="(" separator="," close=")">
                #{item}
            </foreach>
        </if>

.split(’,’)进行切割,注意是英文输入状态的单引号.

### MyBatis `foreach` 标签多字段匹配 在MyBatis中,当需要处理多个字段并将其作为参数传递给SQL语句时,可以利用`<foreach>`标签来简化操作。对于涉及多字段的情况,通常的做法是在Java端准备一个包含这些字段的对象列表或Map集合,在XML映射文件中的SQL部分通过`<foreach>`标签迭代这个对象。 #### Java代码示例 假设有一个场景是要根据一系列博客ID以及对应的作者名称来进行批量更新: ```java // 定义实体类BlogUpdateInfo用于封装每条记录的信息 public class BlogUpdateInfo { private Integer id; private String authorName; // getter and setter methods... } @Test public void batchUpdateTest(){ SqlSession session = Util.getSqlSessionFactory().openSession(); try{ BlogMapper mapper = session.getMapper(BlogMapper.class); List<BlogUpdateInfo> updates = Arrays.asList( new BlogUpdateInfo(1,"Alice"), new BlogUpdateInfo(3,"Bob"), new BlogUpdateInfo(6,"Charlie") ); int result = mapper.batchUpdate(updates); System.out.println(result+" rows affected."); session.commit(); } finally { session.close(); } } ``` #### XML配置文件中的SQL片段 为了配合上述Java方法执行批量更新动作,可以在相应的Mapper XML文件里定义如下形式的SQL语句: ```xml <!-- Mapper.xml --> <update id="batchUpdate"> UPDATE blog SET <trim suffixOverrides=","> <!-- 去除最后一个逗号 --> <foreach collection="list" item="item" separator=", "> (author_name=#{item.authorName}, update_time=NOW()) WHERE id=#{item.id} </foreach> </trim> </update> ``` 这里需要注意的是,由于每次设置都会影响整行的数据,因此建议只修改必要的列,并且确保WHERE子句能够唯一标识要更改的那一行数据。另外,如果涉及到大量数据的操作,则要考虑分批提交以减少内存占用和提高性能[^1]。 针对某些特殊需求比如动态表名或者字段名的情况下,应该谨慎使用`${}`语法代替`#{}`,因为前者不会被预编译从而存在潜在的安全风险[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值