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 指定的名字 ✅ 可以
对象(含集合属性) "对象名.集合属性名" ✅ 可以(遍历内部集合)
普通对象(无集合属性) --- ❌ 不能用,直接 #{对象.属性}
相关推荐
Decay__8 小时前
12_MySQL InnoDB 内存与锁调优 —— Buffer Pool、redo log、隔离级别与锁等待
运维·数据库·sql·mysql·架构
叼烟扛炮8 小时前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
Thneonl19 小时前
桌宠穿透不是一行 SetWindowLong
windows·程序员
Decay__20 小时前
14_MySQL 高可用与容灾架构 —— MGR / InnoDB Cluster / Keepalived+VIP / 双主 / 读写分离 / 两地三中心
运维·数据库·sql·mysql·架构
freejackman20 小时前
【实战三】撕开脱敏盲区:深度解析 CASE WHEN 与窗口函数血缘
大数据·数据库·sql
codigger1 天前
线上数据库连接池打满:从应急止损到架构根治的完整方案
数据库·sql·程序员
挖掘狂人1 天前
线上数据库连接池打满:从应急止损到架构根治的完整方案
数据库·sql·程序员
Thanks_ks1 天前
MySQL 的索引是什么?用图书馆的目录讲明白
数据库·sql·mysql·索引·联合索引·explain·慢查询优化
CoderYanger1 天前
Java EE 进阶:8.MyBatis 操作数据库(入门)(第二弹)
java·数据库·spring boot·spring·面试·java-ee·mybatis
freejackman2 天前
【实战二】字段级血缘追踪:拆解 AST 迷局,精准穿透函数链与子查询
大数据·数据库·sql