mybatis-plus 批量插入示例代码
正常我们使用mybatis-plus插入的时候,首先想到的是saveBatch方法,不过看了下打印出来的sql和底层代码,才发现它并不是真正的批量插入。
IService 中的代码为
default boolean saveBatch(Collection<T> entityList) {
return this.saveBatch(entityList, 1000);
}实现层 ServiceImpl中的代码为
public boolean saveBatch(Collection<T> entityList, int batchSize) {
String sqlStatement = this.getSqlStatement(SqlMethod.INSERT_ONE);
return this.executeBatch(entityList, batchSize, (sqlSession, entity) -> {
sqlSession.insert(sqlStatement, entity);
});
}SqlMethod.INSERT_ONE 的中文枚举为
INSERT_ONE("insert", "插入一条数据(选择字段插入)", "<script>\nINSERT INTO %s %s VALUES %s\n</script>"),通过监控控制台发现,它只是循环每1000条去插入,效率非常低。
参考网友的文章,找到一个支持批量操作的方法,下面直接贴上代码
1、添加批量操作参数类CustomSqlInjector
/**
* 支持自定义SQL注入方法
*/
public class CustomSqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
// 获取父类SQL注入方法列表
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
// 将批量插入方法添加进去
methodList.add(new InsertBatchSomeColumn());
return methodList;
}
}2、在MybatisPlusConfig中配置
@Bean
public CustomSqlInjector customSqlInjector() {
return new CustomSqlInjector();
}3、添加自定义 Mapper接口
/**
* 自定义Mapper,添加批量插入接口
* @param <T>
*/
@Mapper
public interface CustomMapper<T> extends BaseMapper<T> {
/**
* 批量插入
* @param entityList 实体列表
* @return 影响行数
*/
Integer insertBatchSomeColumn(Collection<T> entityList);
}4、将原来的Mapper业务接口,换成继承此接口
@Mapper
public interface StudentDao extends CustomMapper<Student> {
List<Student> query(Student student);
}5、再进行测试一下
@Transactional //事务注解要加上
@Override
public void testBatchCreate() {
List<Student> list = new ArrayList<>();
int startIndex = this.lambdaQuery().select(Student::getId).count();
for (int i = 1; i <= 1000000; i++) {
Student student = new Student();
Long id = SnowFlake.nextId();
student.setId(id);
student.setCode("studentCode-" + (startIndex + i));
student.setName("studentName-" + (startIndex + i));
list.add(student);
}
Long startTime = System.currentTimeMillis();
System.out.println("开始批量操作:" + startTime);
int count = this.baseMapper.insertBatchSomeColumn(list);
Long endTime = System.currentTimeMillis();
System.out.println("完成批量操作:" + endTime);
System.out.println("用时:" + (endTime - startTime));
System.out.println("保存成功:" + count);
//this.saveBatch(list);
}测试结果为,1000000条数据,用时大概在 35秒左右

注意事项:
1、mysql会提示超过max_allowed_packet设置的最大值,到 my.cnf文件(windows为my.ini)修改就行了,我这直接改成 200M
2、此处为示例,实际业务中循环不要放在事务里面
到此这篇关于mybatis-plus 批量插入示例的文章就介绍到这了,更多相关mybatis-plus 批量插入内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
基于Spring Batch向Elasticsearch批量导入数据示例
本文介绍了基于Spring Batch向Elasticsearch批量导入数据示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-02-02
java Swing JFrame框架类中setDefaultCloseOperation的参数含义与用法示例
这篇文章主要介绍了java Swing JFrame框架类中setDefaultCloseOperation的参数含义与用法,结合实例形式分析了Swing组件的JFrame框架类中setDefaultCloseOperation方法的简单使用技巧,需要的朋友可以参考下2017-11-11
Map映射LinkedHashSet与LinkedHashMap应用解析
这篇文章主要为大家介绍了Map映射LinkedHashSet与LinkedHashMap的应用解析,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步2022-03-03
java基本教程之java线程等待与java唤醒线程 java多线程教程
这篇文章主要介绍了对线程等待/唤醒方法,文中使用了多个示例,大家参考使用吧2014-01-01
关于Spring Validation数据校检的使用流程分析
在实际项目中,对客户端传递到服务端的参数进行校验至关重要,SpringValidation提供了一种便捷的方式来实现这一需求,通过在POJO类的属性上添加检查注解,本文给大家介绍Spring Validation数据校检的使用流程,感兴趣的朋友一起看看吧2024-11-11
hibernate-validator后端表单数据校验的使用示例详解
这篇文章主要介绍了hibernate-validator后端表单数据校验的使用,hibernate-validator提供的校验方式为在类的属性上加入相应的注解来达到校验的目的,本文结合示例代码给大家介绍的非常详细,需要的朋友可以参考下2022-08-08
Java利用HttpClient模拟POST表单操作应用及注意事项
本文主要介绍JAVA中利用HttpClient模拟POST表单操作,希望对大家有所帮助。2016-04-04
Java8通过CompletableFuture实现异步回调
这篇文章主要介绍了Java8通过CompletableFuture实现异步回调,CompletableFuture是Java 8 中新增的一个类,它是对Future接口的扩展,下文关于其更多相关详细介绍需要的小伙伴可以参考一下2022-04-04


最新评论