mybatis使用selectkey批量插入
时间: 2025-05-26 21:36:24 浏览: 19
### MyBatis 使用 `selectKey` 实现批量插入的功能
在 MyBatis 中,`selectKey` 是用来设置主键回填的一种机制。当需要实现批量插入时,可以通过组合使用 `<foreach>` 和 `selectKey` 来满足需求。以下是具体的实现方式和代码示例。
#### 批量插入的核心思路
为了支持批量插入操作,通常会采用以下方法:
1. **动态生成主键**:对于每一条记录,通过 `selectKey` 动态生成唯一的主键值。
2. **循环处理数据集合**:利用 MyBatis 的 `<foreach>` 标签遍历传入的参数列表,并逐一插入到数据库中[^1]。
#### XML 映射文件配置
下面是一个完整的 Mapper 文件配置实例,展示如何结合 `selectKey` 和 `<foreach>` 完成批量插入功能。
```xml
<insert id="batchInsertUsers" parameterType="java.util.List">
<!-- 开启事务 -->
BEGIN;
<foreach collection="list" item="item" index="index" separator=";">
<!-- 单条插入语句 -->
INSERT INTO user_entity (id, username, password, comment)
VALUES (
#{item.id},
#{item.username},
#{item.password},
#{item.comment}
);
<!-- 自动为主键赋值 -->
<selectKey resultType="java.lang.String" keyProperty="item.id" order="BEFORE">
SELECT UUID() AS id FROM DUAL
</selectKey>
</foreach>
COMMIT;
</insert>
```
在这个例子中:
- `collection="list"` 表明输入的是一个 Java List 对象。
- `separator=";"` 确保每次插入之间用分号隔开。
- `order="BEFORE"` 指定 `selectKey` 应该发生在实际插入之前,从而先获取主键再执行插入动作[^2]。
> 注意:以上 SQL 片段适用于 MySQL 数据库环境下的 UUID 函数调用。如果是 Oracle 数据库,则可能需要用序列或其他手段代替 `UUID()` 函数。
#### Java 接口定义
相应的 BaseMapper 接口中应声明如下方法签名:
```java
public interface UserMapper extends BaseMapper<UserEntity> {
void batchInsertUsers(@Param("list") List<UserEntity> userList);
}
```
这样就可以直接调用这个接口的方法来进行批量插入了。
#### 测试案例
准备一组测试数据并通过服务层调用上述方法验证效果:
```java
List<UserEntity> users = new ArrayList<>();
for(int i=0;i<5;i++) {
UserEntity entity = new UserEntity();
// 只需填充非主键字段即可
entity.setUsername("TestUser"+i);
entity.setPassword("Passw0rd!");
entity.setComment("This is a test record.");
users.add(entity);
}
// 调用 mapper 进行批插
userMapper.batchInsertUsers(users);
```
---
###
阅读全文
相关推荐


















