在mybatis中,
在MyBatis中,
一、标签的基本语法结构
- collection:指定要遍历的集合或数组,可以是List、Array、Map等。
- item:指定集合中每个元素的别名,在循环体内使用。
- separator:指定每次循环之间插入的分隔符,比如逗号。
- open 和 close:可选,用于在生成内容前后添加字符串,如括号。
一个典型的写法如下:
<foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach>
这段代码会生成类似 (1,2,3) 的结果,常用于 IN 查询。
二、常见使用场景及写法示例
1. IN 查询中的使用
当你需要根据一组ID查询数据时,最常见的方式就是结合
<select id="selectByIds" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </select>
传入的参数是一个 List 或 Array,例如:[1, 2, 3],最终 SQL 会变成:
SELECT * FROM users WHERE id IN (1,2,3);
2. 批量插入数据
在执行批量插入时,也可以用
<insert id="batchInsert"> INSERT INTO users (name, email) VALUES <foreach collection="userList" item="user" separator=","> (#{user.name}, #{user.email}) </foreach> </insert>
注意:这种写法依赖数据库支持多值插入(mysql、PostgreSQL 支持),oracle 不支持这种方式,需要用其他方式处理。
3. 拼接条件语句
有时你可能想根据一个集合动态拼接多个 OR 条件:
<where> <foreach collection="keywords" item="keyword" separator=" OR "> name LIKE CONCAT('%', #{keyword}, '%') </foreach> </where>
这样就能实现多个关键词模糊匹配的效果。
三、关于collection属性的写法细节
传入参数的类型不同,collection 属性的写法也会有所不同:
参数类型 | 示例写法 |
---|---|
List | collection=”list” 或具体名称如 ids |
数组 | collection=”array” 或自定义名如 nums |
Map | collection=”map” 或 key 名如 userIds |
如果你用了注解方式传参,比如:
List<User> selectByIds(@Param("ids") List<Integer> ids);
那 xml 中就可以直接写 collection=”ids”。
四、一些容易出错的地方
- 忘记加括号:IN 查询时如果不加 open=”(” 和 close=”)”,会导致 SQL 语法错误。
- 参数名写错:比如传的是 userIdList,但写了 collection=”ids”,就会找不到集合。
- 不考虑数据库差异:像 Oracle 不支持多值插入,强行使用
构造批量插入会导致失败。 - 误用 item 属性:在 item 中用了非法变量名或重复命名,会影响 SQL 解析。
基本上就这些,掌握好