是 MyBatis 中用于遍历集合/数组的动态 SQL 标签,常用于 IN 查询、批量插入等场景。
java
<foreach collection="array" item="item" open="(" separator="," close=")">
#{item}
</foreach>
| 属性 | 说明 | 示例值 |
|---|---|---|
collection |
要遍历的集合/数组的名称 | "array"、"list"、"coll" |
item |
循环中每个元素的变量名 | "item"、"id" |
open |
遍历结果前添加的字符 | "(" |
separator |
元素之间的分隔符 | "," |
close |
遍历结果后添加的字符 | ")" |
生成的 SQL 示例
假设传入的数组是 1, 2, 3:
sql
(1, 2, 3)
完整用法
sql
SELECT * FROM user WHERE id IN
<foreach collection="array" item="id" open="(" separator="," close=")">
#{id}
</foreach>
sql
SELECT * FROM user WHERE id IN (1, 2, 3)
collection
collection 的值取决于传入参数的类型:
单个数组参数
sql
List<User> selectByIds(Integer[] ids);
sql
<foreach collection="array" item="id">...</foreach>
单个 List 参数
sql
List<User> selectByIds(List<Integer> ids);
sql
<foreach collection="list" item="id">...</foreach>
使用 @Param 注解命名
sql
List<User> selectByIds(@Param("idList") List<Integer> ids);
sql
<foreach collection="idList" item="id">...</foreach>
| 情况 | collection 怎么写 |
|---|---|
单个 List 参数,无 @Param |
写 "list" |
单个数组参数,无 @Param |
写 "array" |
有 @Param("xxx") |
写 "xxx"(必须和注解里的名字一致) |
如果传入的是一个对象(非集合)
sql
public class SearchCondition {
private List<Long> ids;
private String name;
// getter/setter
}
sql
List<User> selectByCondition(@Param("condition") SearchCondition condition);
sql
<!-- 遍历对象内部的集合属性,用 "对象名.属性名" -->
SELECT * FROM user WHERE id IN
<foreach collection="condition.ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
对象内部包含集合属性, 这个属性一定要是集合(List,Array) 其他的不能使用foreach
| 传入参数类型 | collection 怎么写 |
能否用 <foreach> |
|---|---|---|
List |
"list" 或 @Param 指定的名字 |
✅ 可以 |
| 数组 | "array" 或 @Param 指定的名字 |
✅ 可以 |
| 对象(含集合属性) | "对象名.集合属性名" |
✅ 可以(遍历内部集合) |
| 普通对象(无集合属性) | --- | ❌ 不能用,直接 #{对象.属性} |