mybatis使用foreach批量插入写法
时间: 2025-07-19 21:03:45 浏览: 2
### MyBatis 中使用 `foreach` 实现批量插入的写法
在 MyBatis 中,`foreach` 是一个非常强大的标签,可以用于循环处理集合数据。以下是一个完整的示例,展示如何使用 `foreach` 标签实现批量插入操作。
#### SQL Mapper 配置
在 MyBatis 的 XML 映射文件中,可以通过 `<insert>` 标签结合 `foreach` 来实现批量插入。以下是具体代码示例:
```xml
<insert id="batchInsert" parameterType="java.util.List">
INSERT INTO info_notice (id, title, content, nick_name)
VALUES
<foreach collection="list" item="item" separator=",">
(#{item.id,jdbcType=VARCHAR}, #{item.title,jdbcType=VARCHAR},
#{item.content,jdbcType=VARCHAR},
(SELECT nick_name FROM user_info WHERE user_id = #{item.userId,jdbcType=VARCHAR}))
</foreach>
</insert>
```
#### 说明
1. 上述代码中,`collection="list"` 表示传入的参数是一个列表,`item="item"` 表示每次循环时的单个元素[^1]。
2. `separator=","` 指定了每个插入语句之间的分隔符为逗号,确保生成的 SQL 语法正确[^2]。
3. 在插入的字段中,`nick_name` 是通过子查询从 `user_info` 表中动态获取的,避免了在服务层进行多次查询的操作[^1]。
#### Java 代码调用
在服务层或 DAO 层中,可以通过传递一个包含多个对象的列表来调用上述方法。例如:
```java
List<Notice> noticeList = new ArrayList<>();
// 填充 noticeList 数据...
noticeMapper.batchInsert(noticeList);
```
#### 注意事项
1. 如果数据库对单条 SQL 的长度有限制,则需要预估 `list` 的大小,并根据实际情况调整批量插入的策略[^3]。
2. 子查询 `(SELECT nick_name FROM user_info WHERE user_id = #{item.userId})` 可能会影响性能,建议在数据量较大时优化查询逻辑或使用缓存机制[^1]。
#### 示例实体类
假设 `Notice` 类定义如下:
```java
public class Notice {
private String id;
private String title;
private String content;
private String userId; // 对应 user_info 表中的 user_id
// Getters and Setters
}
```
---
###
阅读全文
相关推荐


















