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 指定的名字 ✅ 可以
对象(含集合属性) "对象名.集合属性名" ✅ 可以(遍历内部集合)
普通对象(无集合属性) --- ❌ 不能用,直接 #{对象.属性}
相关推荐
dear_bi_MyOnly2 小时前
【MyBatis 操作数据库】
java·数据库·学习·mybatis·学习方法
山峰哥7 小时前
数据库性能救星:Explain执行计划深度拆解
服务器·开发语言·数据库·sql·启发式算法
数据知道8 小时前
Windows 安全基线:组策略、UAC、Defender 深度配置
windows·安全·网络安全
han_hanker9 小时前
sql语法 DECODE, CASE ... WHEN
数据库·sql·oracle
z落落10 小时前
StudentInfo表 分页、增删改 存储过程+C# WinForm 存储过程实现分页和增删改查
数据库·sql·mysql
用户31268748772010 小时前
分页插件到底怎么拦截 SQL?MyBatis-Plus 插件机制原理一次讲透
mybatis
大模型码小白11 小时前
在 Windows 下 Codex 安装、配置与使用详细指南
java·人工智能·windows
小小龙学IT11 小时前
C++ Placement New 与显式析构:手动对象生命周期管理的艺术
c++·windows·mfc
luyun02020212 小时前
论坛里的小工具,吾爱出品
运维·服务器·windows