<foreach item="item" collection="list"> 参数
时间: 2025-10-19 19:55:53 AIGC 浏览: 2
### `<foreach>` 中 `item` 和 `collection` 参数详解
在 MyBatis 的 `<foreach>` 标签中,`item` 和 `collection` 是两个核心参数,用于控制集合的遍历方式和元素的引用名称。它们在批量插入、更新等操作中发挥关键作用,尤其是在构建 MySQL 的批量插入语句时,能够动态生成多个 `VALUES` 子句。
#### `collection` 参数
`collection` 用于指定需要遍历的集合对象。该集合可以是一个 `List`、`Map` 或数组类型。在实际使用中,通常传入一个 `List` 集合,例如 `List<Map>` 或 `List<Entity>`。在 SQL 语句中,通过 `collection="list"` 可以引用传入的列表参数,MyBatis 会根据该集合中的元素数量生成对应的 SQL 片段[^2]。
例如:
```java
public int saveRunwayFtpPicture(@Param("list") List<Map> list);
```
在 XML 映射文件中使用:
```xml
<foreach collection="list" item="item" separator=",">
(#{item.fileName}, #{item.filePath}, ...)
</foreach>
```
上述代码中,`collection="list"` 表示遍历传入的 `list` 参数。
#### `item` 参数
`item` 用于指定当前遍历元素的变量名。在 `<foreach>` 标签内部,可以通过 `#{item.字段名}` 的方式访问集合中每个元素的属性。例如,如果集合中的元素是 `Map` 类型,则 `item` 表示当前 `Map` 对象,可以通过 `#{item.fileName}` 获取 `fileName` 键对应的值[^4]。
例如:
```xml
<foreach collection="list" item="item" separator=",">
(#{item.fileName}, #{item.filePath}, #{item.fileTime}, ...)
</foreach>
```
上述代码中,`item="item"` 表示每次遍历集合中的一个元素,并将其赋值给 `item` 变量,之后通过 `#{item.fileName}` 访问该元素的属性。
#### 批量插入性能优化
在使用 `<foreach>` 进行批量插入时,需要注意插入行数对性能的影响。一次性插入过多数据可能会导致 SQL 语句过长,增加网络传输负担和数据库解析压力。根据性能测试结果,一次性插入 20~50 行数据通常可以达到较好的执行效率[^1]。
例如,如果需要插入 1000 条数据,可以将数据分批次处理,每次插入 50 条,这样可以减少单条 SQL 语句的长度,提高执行效率[^3]。
---
### 示例代码
以下是一个完整的 MyBatis 批量插入语句示例,使用 `<foreach>` 标签动态生成多个 `VALUES` 子句:
```xml
<insert id="saveRunwayFtpPicture" parameterType="java.util.List">
INSERT INTO runway_picture (
file_name,
file_path,
file_time,
file_type,
file_size,
file_md5,
file_content,
upload_equipment,
create_user,
create_dttm,
update_user,
update_dttm
) VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.fileName},
#{item.filePath},
#{item.fileTime},
#{item.fileType},
#{item.fileSize},
#{item.fileMD5},
#{item.fileContent},
#{item.uploadEquipment},
IFNULL(#{item.createUser}, 'camera'),
SYSDATE(),
IFNULL(#{item.updateUser}, 'camera'),
SYSDATE()
)
</foreach>
</insert>
```
上述语句中,`collection="list"` 指定要遍历的集合,`item="item"` 表示每次遍历的元素,`separator=","` 表示多个 `VALUES` 子句之间用逗号分隔。
---
### 注意事项
- 确保字段顺序与 `VALUES` 中的值顺序一致,否则可能导致插入失败或数据错位。
- 如果字段数量与值数量不匹配,MySQL 会抛出 `Column count doesn't match value count` 错误。
- 对于大规模数据插入,建议采用分批次插入的方式,提高执行效率并减少数据库负载[^1]。
---
阅读全文
相关推荐


















