一、背景
最近的-plus框架的更新,让我们的基础开发如虎添翼。 其中,基本的增删改查,代码生成器大家一定都会用,非常爽。 在我的使用过程中,我也遇到了一些陷阱。 比如看这个不是批量添加,批量添加或者更新,看api进行开发,感觉太好用了。 开发测试了一下,速度就像蜗牛一样,对于大数据量来说确实难以忍受。 我在控制台上发现,名义上是批量插入或者是一条一条插入,难怪速度那么慢。
2. 解决方案
查阅网上信息一般有两种解决方案:
(1). 使用xml,自己写sql语句。 这种方法的一个缺点是,如果表中的字段很多,而且有几十个字段,那么编写批量添加、批量修改的SQL语句实在是一场噩梦。
INSERT INTO t
(id, age)
VALUES
(3, 28),
(4, 29)
ON DUPLICATE KEY UPDATE
id = VALUES(id),
age = VALUES(age);
(2)-plus新增了sql注入器,可以通过sql注入器实现批量添加和批量添加修改功能。 一次注射,随时使用,使用极其方便。 缺点是项目启动时会注册sql注入器,稍微影响启动速度。
3.添加依赖
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-extensionartifactId>
<version>3.4.3.4version>
dependency>
4.继承默认方法注入
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 getMethodList(Class> mapperClass, TableInfo tableInfo) {
List methodList = super.getMethodList(mapperClass, tableInfo);
methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
return methodList;
}
}
5、在配置文件中注入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();
}
6. 自带扩展
包下新建一个接口,扩展自带
import com.baomidou.mybatisplus.core.mapper.baseMapper;
import java.util.List;
public interface EasybaseMapper extends baseMapper {
Integer insertBatchSomeColumn(List entityList) ;
}
7. 业务实现
mapper继承
public interface MonitorReportRecordMapper extends EasybaseMapper {
}
层使用
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 {
@Transactional(rollbackFor = Exception.class)
public void updateMonitorRecord(List insertList) {
this.baseMapper.insertBatchSomeColumn(insertList);
}
}