MyBatis的foreach标签用于安全批量处理集合,支持IN查询和批量插入;需正确设置collection属性并与Java传参严格对应,配合if判断空集合、统一使用#{}防注入。

MyBatis 的 foreach 标签是批量处理集合最常用、最稳妥的方式,核心在于把 List、数组或 Map 中的元素自动展开为合法 SQL 片段,避免手动拼接和 SQL 注入风险。
IN 查询:用 foreach 拼出 (1,2,3) 结构
适用于根据多个 ID 或值查数据。关键点是 open 和 close 加括号,separator 控制逗号分隔:
- Mapper 接口方法传参为
List<Long> ids或Long[] ids - XML 中写法:
<foreach collection="ids" item="id" open="(" separator="," close=")">#{id}</foreach> - 传入
[101, 102, 103]→ 自动转成IN (101,102,103)
批量插入:一行 SQL 插多条记录
MySQL、PostgreSQL 等支持 INSERT INTO ... VALUES (...), (...), (...) 语法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- collection 值取决于参数名,如
@Param("users") List<User> users→collection="users" - item 是每条记录别名,如
item="u",SQL 中用#{u.name}取值 - separator 必须为英文逗号,open/close 通常不填(除非整个 values 需包裹)
collection 属性怎么填才不报错
这是最容易出错的地方,必须和 Java 层传参方式严格对应:
立即学习“Java免费学习笔记(深入)”;
- 单个 List 参数(没加
@Param)→collection="list" - 单个数组参数 →
collection="array" - 用
@Param("ids")显式命名 →collection="ids" - 多个参数封装进 Map →
collection="ids"(即 Map 的 key 名)
安全与健壮性补充建议
实际项目中不能只靠 foreach,还要配合其他标签防异常:
- 空集合时 SQL 会出错(如
IN ()),需外层加<if test="ids != null and !ids.isEmpty()"> - 避免用
${}拼接,一律用#{}防注入 - Oracle 不支持多值 INSERT,批量插入需改用
INSERT ALL或分批执行

















