Mybatis-Plus批量新增

背景:提供的insertBatch是假批量,重复的IO连接与断开效率极低,提供了insertBatchSomeColumn真批量需要自己手动配置

直接上代码:

public interface MyMapper extends BaseMapper {

    /**
     * 默认批次提交数量
     */
    int DEFAULT_BATCH_SIZE = 1000;

    /**
     * 批量新增数据,自选字段 insert. 自动按每批1000插入数据库
     * 此填充不会填充 FieldFill.UPDATE 的字段。
     * 注意数据库默认更新的字段也需要手工设置
     *
     * @param entityList 数据
     * @return 插入条数
     */
    @Transactional(rollbackFor = Exception.class)
    default int insertBatch(List entityList) {
        return this.insertBatchSomeColumn(entityList, DEFAULT_BATCH_SIZE);
    }

    /**
     * 批量新增数据,自选字段 insert
     * 不会分批插入,需要分批请调用方法insertBatch或者 insertBatchSomeColumn(List entityList, int size)
     * 此填充不会填充 FieldFill.UPDATE 的字段。
     * 注意数据库默认更新的字段也需要手工设置
     *
     * @param entityList 数据
     * @return 插入条数
     */
    int insertBatchSomeColumn(List entityList);

    /**
     * 分批插入。每次插入
     * @param entityList 原实体对象
     * @param size 分批大小
     * @return 总插入记录
     */
    @Transactional(rollbackFor = Exception.class)
    default int insertBatchSomeColumn(List entityList, int size) {
        if (CollUtil.isEmpty(entityList)) {
            return 0;
        }
        List> split = CollUtil.split(entityList, size);
        return split.stream().mapToInt(this::insertBatchSomeColumn).sum();

    }
}

有使用工具类,可以引入以下依赖


      cn.hutool
      hutool-all
      5.8.3

以下的操作也需要,要不可能会有其他bug:

public class MySqlInjector extends DefaultSqlInjector {

    @Override
    public List getMethodList(Class mapperClass) {
        List 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();
    }
}

你可能感兴趣的:(mybatis,java)