foreach 循环遍历
<foreach> 标签遍历传入的集合、数组或 Map,动态生成 SQL 片段,是 IN 查询、批量操作的核心标签。
核心属性
| 属性 | 作用 | 示例值 |
|---|---|---|
| collection | 指定要遍历的集合/数组/Map | list、array、ids |
| item | 每次迭代元素的变量名 | id、item、u |
| index | 当前迭代序号(Map 遍历时为 key) | index |
| open | 遍历结果整体开头拼接的字符串 | (、VALUES ( |
| close | 遍历结果整体结尾拼接的字符串 | )、; |
| separator | 元素之间的分隔符 | ,、OR |
IN 查询
最常见场景是 IN 条件查询:
XML
<select id="findByIds" resultType="User">
SELECT * FROM user
WHERE id IN
<foreach collection="list" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
传入 [1, 2, 3] 时:
SQL
SELECT * FROM user WHERE id IN (?, ?, ?)
批量 INSERT
XML
<insert id="batchInsert">
INSERT INTO user (name, age, email)
VALUES
<foreach collection="list" item="u" separator=",">
(#{u.name}, #{u.age}, #{u.email})
</foreach>
</insert>
传入多个 User 对象时:
SQL
INSERT INTO user (name, age, email)
VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?)
OR 条件拼接
使用 separator 拼接逻辑运算符:
XML
<select id="findMultiCondition" resultType="User">
SELECT * FROM user
<where>
<foreach collection="keywords" item="kw" open="(" separator=" OR " close=")">
name LIKE #{kw}
</foreach>
</where>
</select>
传入 ["张", "李"] 时:
SQL
SELECT * FROM user WHERE (name LIKE ? OR name LIKE ?)
Map 遍历
遍历 Map 时 item 为 value,index 为 key:
XML
<update id="updateByMap">
UPDATE user
<set>
<foreach collection="map" item="value" index="key" separator=",">
${key} = #{value}
</foreach>
</set>
WHERE id = #{id}
</update>
传入 {name: "张三", age: 25} 时:
SQL
UPDATE user SET name = ?, age = ? WHERE id = ?
Map 遍历时
${key}用于列名,#{value}用于参数值,防止 SQL 注入。
数组遍历
数组与 List 遍历方式相同:
XML
<select id="findByArray" resultType="User">
SELECT * FROM user
WHERE role IN
<foreach collection="array" item="role" open="(" separator="," close=")">
#{role}
</foreach>
</select>
嵌套遍历
复杂场景支持嵌套:
XML
<insert id="batchInsertWithRoles">
INSERT INTO user_role (user_id, role_id)
VALUES
<foreach collection="users" item="u" separator=",">
<foreach collection="u.roles" item="role" separator="),(">
#{u.id}, #{role.id}
</foreach>
</foreach>
</insert>
collection 属性取值规则
| 传入参数类型 | collection 取值 |
|---|---|
| List | list |
| Set | collection |
| 数组 | array |
| 命名参数(@Param) | 注解指定的名称 |
| Map | Map 的 key 名称 |
使用 @Param 注解时:
Java
List<User> findByIds(@Param("ids") List<Integer> ids);
XML
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
注意事项
- foreach 内部为空时,open/close 仍会输出,如
()可能导致 SQL 语法错误 - IN 查询元素过多时注意数据库限制(MySQL 默认约 1000 个)
- Map 遍历时列名用
${},参数值用#{},防止注入 - collection 必须与传入参数名称匹配,使用 @Param 时可自定义
要点总结
- foreach 遍历集合/数组/Map,通过 collection/item/open/close/separator 控制 SQL 拼接
- IN 查询使用
open="(" separator="," close=")"生成(?, ?, ?) - 批量 INSERT 使用
separator=","拼接多个值组 - Map 遍历时 index 为 key、item 为 value,列名用
${},值用#{} - 使用 @Param 注解可自定义 collection 名称,避免使用默认的 list/array
📝 发现内容有误?点击此处直接编辑