mybatis中使用foreach
时间: 2025-05-25 19:09:32 浏览: 52
### MyBatis 中 `<foreach>` 的用法
#### 基本概念
MyBatis 提供了强大的动态 SQL 功能,而 `<foreach>` 标签是其中一个重要的组成部分。它可以用于遍历集合,在生成复杂查询语句时非常有用,比如构建 `IN` 子句或执行批量操作。
#### 属性说明
`<foreach>` 标签的主要属性及其含义如下:
- **collection**: 表示要迭代的集合名称。如果传入的是简单类型的数组或列表,则可以直接命名为 `array` 或 `list`;如果是 Map 类型的数据源,则需要指定键名。
- **item**: 定义每次迭代取出的对象变量名。
- **open**: 遍历时生成的字符串开头部分。
- **close**: 遍历时生成的字符串结尾部分。
- **separator**: 每次迭代之间的分隔符。
这些属性共同决定了如何构造最终的 SQL 字符串[^1]。
#### 使用场景与示例
##### 场景一:生成 IN 子句
当需要根据一组值筛选记录时,可以利用 `<foreach>` 构建 `IN` 条件子句:
```xml
<select id="selectPostIn" parameterType="map" resultType="domain.blog.Post">
SELECT * FROM POST P
WHERE ID in
<foreach item="id" index="index" collection="ids"
open="(" separator="," close=")">
#{id}
</foreach>
</select>
```
在此例子中,假设传递给方法的参数是一个名为 `ids` 的 List 对象,那么会自动将其转换成逗号分隔的形式并嵌套到括号内作为合法的 SQL 片段[^1]。
##### 场景二:批量插入数据
对于大批量新增操作而言,也可以借助于 `<foreach>` 实现高效的一次性提交多个实体对象至数据库表中去:
```xml
<insert id="batchInsertUser">
INSERT INTO USER (NAME, AGE) VALUES
<foreach collection="users" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
```
这里假定我们有一个 User 列表被注入进来,通过循环读取每一个 user 元素,并按照固定的模板填充对应的字段值完成整个 DML 描述工作流程。
#### 注意事项
需要注意的是,当尝试访问某个不存在的属性时可能会抛出异常。例如,“There is no getter for property named 'list'”,这表明当前上下文中并没有找到对应名字叫作 list 的成员变量getter 方法存在[^3]。因此,在实际开发过程中应当仔细核验所绑定的实际模型结构是否匹配预期定义。
---
### 示例代码展示
以下是完整的 XML 映射配置片段演示如何应用以上提到的功能特性:
```xml
<!-- 查询 -->
<select id="findUsersByIds" resultMap="BaseResultMap" parameterType="java.util.List">
SELECT *
FROM users u
WHERE u.id IN
<foreach collection="list" item="userId" open="(" separator="," close=")">
#{userId}
</foreach>
</select>
<!-- 批量插入 -->
<insert id="addBatchUsers" parameterType="java.util.List">
INSERT INTO t_user(name, age)
VALUES
<foreach collection="list" item="user" separator=",">
(#{user.name}, #{user.age})
</foreach>
</insert>
```
上述两个实例分别展示了基于输入参数集合作为目标范围内的检索请求以及针对目标资源实施集体写入动作的具体实现方式[^2]。
---
阅读全文
相关推荐
















