在 MyBatis 中编写动态 SQL 时,foreach 标签无疑是高频利器,不过很多开发者初次接触时容易被它的属性绕晕。别担心,咱们把核心参数逐一拆解,再用三个典型场景演示一遍,你就能灵活运用了。
collection 属性决定了你要遍历的数据类型,共有三种取值:list、array、map——分别对应 List、数组、Map 这三种集合。其中 item 是每次迭代时元素的别名,index 表示当前迭代的下标位置。open 和 close 分别控制拼接时添加的前缀和后缀,separator 则是元素之间的分隔符。搞懂这些参数后,直接看实例。
先看数组的用法
假设有一组 ID 数组:int[] ids = {1,2,3,4,5},我们要根据这些 ID 查询 team 表。参数类型传 int[](注意这里传的是数组,所以 collection 写 array),foreach 会自动把 ID 拼成 (1,2,3,4,5) 的格式。
再来看 Map 的应用
当参数是 java.util.HashMap 时,collection 要填写 keys(即你在 Map 中存储的键集合名称)。这个例子中,我们既要模糊匹配 title,又要限制 ID 范围,因此把 keys 作为集合传给 foreach。

最后是 List 的遍历
List 是最常用的场景,直接传入 java.util.List,collection 填 list 即可。比如要批量查询 ID 列表,写法简洁明了。
总结一下:collection 的值取决于你传入的参数类型,数组用 array,Map 用你指定的键集合名(通常取名 keys 或 values),List 用 list。牢记这个对应关系,再套用 open/separator/close 的格式,动态 IN 查询基本不会出错。
