sql语法 MyBatis <foreach> 标签详解

是 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 指定的名字 ✅ 可以
对象(含集合属性) "对象名.集合属性名" ✅ 可以(遍历内部集合)
普通对象(无集合属性) --- ❌ 不能用,直接 #{对象.属性}
相关推荐
Vex2une8 小时前
Docker Desktop WSL2后端:2026年性能调优与避坑实战指南
windows·docker·desktop·gpu容器·容器开发·virtiofs·buildkit
阿里云大数据AI技术9 小时前
StarRocks 与 Fluss 用一条 SQL 查实时与历史
人工智能·sql
钱栈up9 小时前
搜狗中文模式打不出顿号?在 Windows 沙箱里探测输入法配置的踩坑实录
windows
白搞电子10 小时前
ZeroClaw 是什么?与 ESP-Claw 的区别及文件整理用途示例
windows·物联网
BeiGuTing_code11 小时前
Java动态数组(一)
java·数据结构·windows
千桐科技14 小时前
qData 数据中台专业版功能解析:告别 Excel 与 SQL 拼凑,打通系统合并的可追踪数据链路
数据库·sql·excel·qdata
我就是不信14 小时前
Java8 lambda 表达式 forEach 如何提前终止?
开发语言·windows·python
陈工大模型15 小时前
2026 Windows 免费压缩软件横向评测:7-Zip、WinRAR、Bandizip、NanaZip 与 Win 解压缩
windows·电脑·winrar·7-zip·web app·软件·win解压缩
燃烧的枫15 小时前
Windows 下 YOLO26 的 TensorRT C++ 部署
人工智能·pytorch·windows·计算机视觉·tensorrt·cuda·yolo26
钱栈up15 小时前
从 macOS 切回 Windows,我用 5 个免费工具把 80% 操作习惯搬了回来
windows·macos·策略模式