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