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 指定的名字 ✅ 可以
对象(含集合属性) "对象名.集合属性名" ✅ 可以(遍历内部集合)
普通对象(无集合属性) --- ❌ 不能用,直接 #{对象.属性}
相关推荐
shada1 小时前
CMake指定 MSVC 工具集与 Windows SDK
c++·windows
the3clipse1 小时前
Windows 10 与 Windows 11 视频编解码区别:AV1、HEVC、HDR 与 D3D12 编码支持对比
windows·h.265·hevc·hdr·av1·视频解码·d3d12
郭庆汝1 小时前
(三)MCP+A2A 从0到1构建类Manus多Agent全栈应用
windows
the3clipse2 小时前
MacOS、Linux 与 Windows 视频编解码对比:AV1、HEVC、ProRes 与硬件加速优劣势
linux·windows·macos·hevc·av1·视频解码·硬件解码
明王明王2 小时前
PVE 上用 SPICE:统一连接 Debian、Arch 和 Windows 11 桌面
运维·windows·debian
学逆向的3 小时前
win32消息类型
windows·网络安全·mfc·api·win32
TeamDev3 小时前
JxBrowser 9.5.2 版本发布啦!
java·前端·windows·chromium·混合应用·jxbrowser·浏览器控件
\光辉岁月/3 小时前
6.mybatisplus学习-BaseMapper、Service、常用注解
java·mybatis·mybatisplus
Andreapiki3 小时前
数字化审计校招技术备考指南:SQL、Python、BI、RPA学习路径
python·sql·rpa
段一凡-华北理工大学13 小时前
大模型应用开发 100 天:Python + LLM 从入门到精通 day26~Prompt 调试与优化——A/B 测试与效果评估
windows·python·大模型·prompt·智能体·提示词工程·高炉智能化