一,背景
最近mybatis-plus框架的更新,让我们基础开发中如虎添翼。其中基本的增删改查,代码生成器想必大家用着那叫一个爽。本人在使用中,也遇到一些坑。
比如savebatch,saveorupdatebatch
,看着这不是批量新增,批量新增或更新嘛,看着api进行开发,感觉也太好用啦。
开发完一测试,速度跟蜗牛一样,针对大数据量真是无法忍受。在控制台上发现,怎么名义上是批量插入,还是一条一条的进行插入,难怪速度龟速。
一,解决办法
查阅网上资料,大体有两种解决方案:
-
使用mybatis的xml,自己进行sql语句编写。该方法一个缺点是如果表的字段较多,有个几十个字段,写批量新增,批量新增修改的sql语句真是个噩梦。
INSERT INTO t (id, age) VALUES (3, 28), (4, 29) ON DUPLICATE KEY UPDATE id = VALUES(id), age = VALUES(age);
-
mybatis-plus 新添加了一个sql注入器,通过sql注入器可以实现批量新增,批量新增修改功能。一次注入,随时使用,使用极其方便。
缺点就是项目启动时候,会进行sql注入器注册,稍微影响启动速度。
三,添加依赖
<!--mybatis plus extension,包含了mybatis plus core-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>3.4.3.4</version>
</dependency>
四, 继承默认方法注入
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import java.util.List;
public class EasySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
methodList.add(new InsertBatchSomeColumn());
return methodList;
}
}
五, 在 MybatisPlusConfig 配置文件中注入 Bean
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
/**
* 分页插件
*/
// @Bean
// public PaginationInterceptor paginationInterceptor() {
// PaginationInterceptor page = new PaginationInterceptor();
// page.setDialectType("mysql");
// return new PaginationInterceptor();
// }
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
@Bean
public MetaObjectHandler metaObjectHandler() {
return new MyMetaObjectHandler();
}
@Bean
public GlobalConfig globalConfiguration() {
GlobalConfig conf = new GlobalConfig();
// 自定义的注入需要在这里进行配置
conf.setSqlInjector(easySqlInjector());
return conf;
}
@Bean
public EasySqlInjector easySqlInjector() {
return new EasySqlInjector();
}
六, 扩展自带 BaseMapper
在 mapper 包下新建 EasyBaseMapper
接口,扩展自带 BaseMapper
。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
public interface EasyBaseMapper<T> extends BaseMapper<T> {
/**
* 批量插入 仅适用于mysql
* @param entityList 实体列表
* @return 影响行数
*/
Integer insertBatchSomeColumn(List<T> entityList);
}
七,业务实现
mapper继承。
public interface MonitorReportRecordMapper extends EasyBaseMapper<MonitorReportRecord> {
}
service层使用。
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xinchen.admin.modules.monitoranalysis.mapper.MonitorReportRecordMapper;
import com.xinchen.api.monitoranalysis.entity.MonitorReportRecord;
import com.xinchen.api.utils.DateUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
@Service
public class MonitorReportRecordService extends ServiceImpl<MonitorReportRecordMapper, MonitorReportRecord> {
@Transactional(rollbackFor = Exception.class)
public void updateMonitorRecord(List<MonitorReportRecord> insertList) {
this.baseMapper.insertBatchSomeColumn(insertList);
}
}