mybatis foreach使用
时间: 2025-07-04 22:17:47 浏览: 6
在 MyBatis 中,`<foreach>` 标签是一个非常重要的动态 SQL 元素,主要用于处理集合或数组类型的参数,支持批量操作,如插入、更新和查询。它能够将集合中的元素遍历并生成对应的 SQL 语句片段,从而实现灵活的 SQL 拼接功能。
### 基本语法
`<foreach>` 标签的基本语法如下:
```xml
<foreach item="item" index="index" collection="collection" open="(" close=")" separator=",">
<!-- 写入具体的 SQL 语句 -->
</foreach>
```
- `item`:用于表示集合中每一个元素的变量名。
- `index`:用于表示当前元素的索引(可选)。
- `collection`:指定需要遍历的集合或数组的名称。
- `open`:指定遍历开始前添加的字符串。
- `close`:指定遍历结束后添加的字符串。
- `separator`:指定每个元素之间的分隔符。
### 使用场景及示例
#### 1. 批量删除
当需要根据一个 ID 列表进行批量删除时,可以使用 `<foreach>` 标签来生成 `IN` 子句。例如:
```java
public void delete(@Param("list") List<String> list);
```
对应的 XML 配置如下:
```xml
<delete id="delete" parameterType="java.util.List">
delete from account where id in (
<foreach collection="list" item="id" index="index" separator="," open="" close="">
#{id}
</foreach>
)
</delete>
```
上述代码会生成类似 `DELETE FROM account WHERE id IN (1, 2, 3)` 的 SQL 语句 [^5]。
#### 2. 动态条件查询
在查询时,如果希望根据一组 ID 来筛选数据,可以结合 `<where>` 和 `<foreach>` 标签实现动态查询:
```xml
<select id="foreach_test" parameterType="map" resultType="com.pojo.Blog">
select * from Blog
<where>
<foreach collection="ids" item="id" open="and (" separator="or" close=")">
id=#{id}
</foreach>
</where>
</select>
```
该查询会生成类似 `SELECT * FROM Blog WHERE id IN (1 OR id=2 OR id=3)` 的 SQL 语句 [^3]。
#### 3. 批量插入
在进行批量插入操作时,可以通过 `<foreach>` 遍历列表,并为每条记录生成对应的值部分:
```xml
<insert id="batchInsert">
INSERT INTO users (name, email)
VALUES
<foreach collection="userList" item="user" separator=",">
(#{user.name}, #{user.email})
</foreach>
</insert>
```
此配置会生成类似 `INSERT INTO users (name, email) VALUES ('Alice', '[email protected]'), ('Bob', '[email protected]')` 的 SQL 语句 [^2]。
#### 4. 处理 Map 类型参数
当传入的参数是 `Map` 类型时,可以使用 `<foreach>` 遍历其中的键值对。例如:
```xml
<insert id="insertMultiple">
INSERT INTO orders (order_id, customer_name)
VALUES
<foreach collection="orderMap" item="entry" separator=",">
(#{entry.key}, #{entry.value})
</foreach>
</insert>
```
这段代码假设 `orderMap` 是一个 `Map<Integer, String>`,并且会生成对应的插入语句 [^1]。
### 注意事项
- 在使用 `<foreach>` 时,必须确保传入的集合不为空,否则可能导致 SQL 语法错误。
- 如果传入的是 `List` 或 `Map`,应正确指定 `collection` 属性的值。
- 可以通过 `@Param` 注解显式命名参数,避免因参数类型复杂而出现解析问题。
###
阅读全文
相关推荐



















