全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 8 分钟 ✍️ juanwangdev

foreach 循环遍历

<foreach> 标签遍历传入的集合、数组或 Map,动态生成 SQL 片段,是 IN 查询、批量操作的核心标签。

核心属性

属性作用示例值
collection指定要遍历的集合/数组/Maplistarrayids
item每次迭代元素的变量名iditemu
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 取值
Listlist
Setcollection
数组array
命名参数(@Param)注解指定的名称
MapMap 的 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

📝 发现内容有误?点击此处直接编辑

← 上一篇 choose-when-otherwise 分支
下一篇 → if 条件判断
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库