mybatisplus3.3.0中批量插入用什么方法
时间: 2024-02-11 22:06:09 浏览: 78
MyBatis-Plus 3.3.0 中的 BaseMapper 确实没有提供批量插入的方法,但是可以使用 MyBatis 原生的批量插入方法来实现。
MyBatis 提供了 `BatchExecutor` 执行器来支持批量操作,它可以将多个 SQL 语句打包成一个大的 SQL 语句,然后一次性执行,从而大大提高了数据库操作的效率。在 MyBatis 中,需要使用 SqlSession 的 `batch` 方法来执行批量操作。
以下是一个示例代码:
```java
List<User> userList = new ArrayList<>();
// 假设需要批量插入的 User 对象存放在 userList 中
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
try {
for (User user : userList) {
userMapper.insert(user);
}
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
} finally {
sqlSession.close();
}
```
上述代码中,首先通过 `sqlSessionFactory` 获取 `SqlSession` 对象,并指定执行器类型为 `ExecutorType.BATCH`。然后,通过 `SqlSession` 的 `getMapper` 方法获取 `UserMapper` 接口的实例,然后循环遍历 `userList`,逐一插入数据。最后,调用 `SqlSession` 的 `commit` 方法提交事务,或者在出现异常时调用 `rollback` 方法回滚事务。
需要注意的是,如果插入的数据量较大,可能会导致内存溢出,可以通过调整 `batchSize` 的大小来控制批量插入的效率和内存占用。例如,可以将 `batchSize` 大小设置为 1000,即每插入 1000 条数据就进行一次批量插入操作:
```java
final int batchSize = 1000;
int count = 0;
try {
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
for (User user : userList) {
userMapper.insert(user);
if (++count % batchSize == 0) {
sqlSession.flushStatements();
}
}
sqlSession.commit();
} catch (Exception e) {
sqlSession.rollback();
} finally {
sqlSession.close();
}
```
上述代码中,使用了 `sqlSession.flushStatements()` 方法来刷新批量执行器中的语句,从而避免内存溢出。
阅读全文