sql语法 MyBatis <foreach> 标签详解

📅 2026/7/10 11:26:18 👁️ 阅读次数 📝 编程学习
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指定的名字✅ 可以
对象(含集合属性)"对象名.集合属性名"✅ 可以(遍历内部集合)
普通对象(无集合属性)❌ 不能用,直接#{对象.属性}