Skip to content

foreach标签


在写 MyBatis Mapper XML 时,经常会遇到 集合参数,比如 ID 列表、状态列表。直接拼接 SQL 不仅繁琐,还容易出错,MyBatis 提供了 <foreach> 标签,专门用于 遍历集合生成 SQL

<foreach collection="集合名" item="单个元素名" open="开头字符" separator="分隔符" close="结尾字符">
#{单个元素名}
</foreach>
  • collection:集合变量名(通常是 mapper 方法参数或对象属性);

  • item:遍历时每个元素的占位符;

  • open:输出内容的起始符号,例如 (

  • separator:元素之间的分隔符,例如 ,

  • close:输出内容的结束符号,例如 )

假设有一个状态列表 distributeStatuses,需要生成 SQL:

<if test="distributeStatuses != null and distributeStatuses.length > 0">
AND fbvh.distribute_status IN
<foreach collection="distributeStatuses" item="distributeStatus" open="(" separator="," close=")">
#{distributeStatus}
</foreach>
</if>
  • distributeStatuses = [1,2,3] 时,生成 SQL:
AND fbvh.distribute_status IN (1,2,3)
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO user (id, name)
VALUES
<foreach collection="list" item="user" separator=",">
(#{user.id}, #{user.name})
</foreach>
</insert>
  • 可以一次性批量插入多条记录,效率比循环调用单条插入高。