java开发springBoot+mybatisPlus已经成为主流,最近遇到新旧系统的切换,批量插入读取原来的数据插入到新的系统的表中,使用mybatisPlus的方法
saveBatch(),但是发现巨慢,查询源码和sql发现其实里面也是遍历之后再单条插入,难怪慢呢.其实就是伪批量,可能再事务提交上有处理,但是还是不能容忍.查资料整理出来一套正式的批量插入方法,生产已经使用,实测10W数据.1-3分钟左右可插入,完全可以满足需求,有需要的小伙伴可以参考,简简单单集成到自己的系统,废话不多说,直接上代码:
第一步:创建 EasySqlInjector到spring容器
@Bean public EasySqlInjector easySqlInjector() { return new EasySqlInjector(); }
第二部:创建自定义mapper接口
自定义 mapper接口,扩展BaseMapper,并使用mybatis的真实批量插入方法
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import java.util.Collection; /** * @description:批量插入 * @author: xxx * @create: 2020-12-21 14:27 **/ public interface EasyBaseMapper<T> extends BaseMapper<T> { /** * 批量插入 * * @param entityList 实体列表 * @return 影响行数 */ Integer insertBatchSomeColumn(Collection<T> entityList); }
第三步:创建批量插入的实现类 BaseIServiceImpl
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.atomic.AtomicReference; /** * @description:批量插入的方法 **/ @Service @Slf4j public class BaseIServiceImpl<M, T> { @Autowired @Qualifier(value = "defaultThreadPoolExecutor") private ThreadPoolExecutor threadPoolExecutor;