# 4.4 foreach 标签用法

<mark style="color:blue;">**foreach 标签**</mark>可以对**数组**、**Map**或实现了**Iterable接口**（如List、Set）的对象进行**遍历**。数组在处理时会转换为List对象，因此foreach遍历的对象可以分为两大类：**Iterable**类型和**Map**类型，这两种类型在遍历循环时情况不一样。

{% code overflow="wrap" %}
```xml
<foreach collection="Iterable|Map" item="element" index="idx|key" open="(" close=")" separator=",">

</foreach>
```
{% endcode %}

foreach 包含以下属性。

* **collection**：必填，值为要循环迭代的属性名。
* **item**：变量名，值为从迭代过程中取出的每一个元素。
* **index**：索引的属性名。
  * 在集合数组情况下值为当前**索引值**；
  * 当迭代循环的对象是Map类型时，这个值为Map的**key（键值）**。
* **open**：整个循环内容开头的字符串。
* **close**：整个循环内容结尾的字符串。
* **separator**：每次循环的分隔符。

> 在**Mapper接口**对应的方法中：
>
> * 如果参数类型为**集合Collection**的时候，默认会转换为Map类型，并添加一个**key为collection**的值（MyBatis 3.3.0版本中增加）。
> * 如果参数类型是**List**集合，那么就继续添加一个**key为list**的值（MyBatis 3.2.8及低版本中只有这一个key），这样，当collection="list"时，就能得到这个集合，并对它进行循环操作。
> * 当参数类型为**数组**的时候，也会转换成Map类型，默认的**key为array**。
>
> <mark style="color:orange;">**推荐使用@Param来指定参数的名字，这时collection就设置为通过@Param注解指定的名字。**</mark>
>
> 使用Map和使用@Param注解方式类似，将collection指定为对应Map中的key即可。**如果要循环所传入的Map，推荐使用@Param注解指定名字，此时可将collection设置为指定的名字**，**如果不想指定名字，就使用默认值\_parameter。**
