一.背景
最近mybatis-plus框架的更新,讓我們基礎開發中如虎添翼。其中基本的增刪改查,代碼生成器想必大家用着那叫一個爽。本人在使用中,也遇到一些坑。
比如savebatch,saveorupdatebatch,看着這不是批量新增,批量新增或更新嘛,看着api進行開發,感覺也太好用啦。
開發完一測試,速度跟蝸牛一樣,針對大數據量真是無法忍受。在控制台上發現,怎么名義上是批量插入,還是一條一條的進行插入,難怪速度龜速。
二.解決辦法
查閱網上資料,大體有兩種解決方案:
(1).使用mybatis的xml,自己進行sql語句編寫。該方法一個缺點是如果表的字段較多,有個幾十個字段,寫批量新增,批量新增修改的sql語句真是個噩夢。
INSERT INTO t
(id, age)
VALUES
(3, 28),
(4, 29)
ON DUPLICATE KEY UPDATE
id = VALUES(id),
age = VALUES(age);
(2)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);
}
}