背景:提供的insertBatch是假批量,重复的IO连接与断开效率极低,提供了insertBatchSomeColumn真批量需要自己手动配置
直接上代码:
public interface MyMapper<T> extends BaseMapper<T> {
/**
* 默认批次提交数量
*/
int DEFAULT_BATCH_SIZE = 1000;
/**
* 批量新增数据,自选字段 insert. 自动按每批1000插入数据库
* 此填充不会填充 FieldFill.UPDATE 的字段。
* 注意数据库默认更新的字段也需要手工设置
*
* @param entityList 数据
* @return 插入条数
*/
@Transactional(rollbackFor = Exception.class)
default int insertBatch(List<T> entityList) {
return this.insertBatchSomeColumn(entityList, DEFAULT_BATCH_SIZE);
}
/**
* 批量新增数据,自选字段 insert
* 不会分批插入,需要分批请调用方法insertBatch或者 insertBatchSomeColumn(List<T> entityList, int size)
* 此填充不会填充 FieldFill.UPDATE 的字段。
* 注意数据库默认更新的字段也需要手工设置
*
* @param entityList 数据
* @return 插入条数
*/
int insertBatchSomeColumn(List<T> entityList);
/**
* 分批插入。每次插入
* @param entityList 原实体对象
* @param size 分批大小
* @return 总插入记录
*/
@Transactional(rollbackFor = Exception.class)
default int insertBatchSomeColumn(List<T> entityList, int size) {
if (CollUtil.isEmpty(entityList)) {
return 0;
}
List<List<T>> split = CollUtil.split(entityList, size);
return split.stream().mapToInt(this::insertBatchSomeColumn).sum();
}
}
有使用工具类,可以引入以下依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.3</version>
</dependency>
以下的操作也需要,要不可能会有其他bug:
public class MySqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
// 例: 不要指定了 update 填充的字段
methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
return methodList;
}
}
@Configuration
public class MybatisPlusConfig {
/**
* 自定义内置选装件
* @return
*/
@Bean
public MySqlInjector sqlInjector() {
return new MySqlInjector();
}
}