MybatisPlus批量插入(伪批量),增强为真实批量插入

项目基于优秀开源项目:若依

项目背景:项目中牵扯到数据批量导入,为提高性能,先考虑将MybatisPlus伪批量插入增强为真实批量插入

MybatisPlus源码:

MybatisPlus支持批量插入,但是跟踪源码发现底层是将批量插入的数据循环执行了N次单条插入:

IService源码:

java 复制代码
    @Transactional(
        rollbackFor = {Exception.class}
    )
    default boolean saveBatch(Collection<T> entityList) {
        return this.saveBatch(entityList, 1000);
    }

    boolean saveBatch(Collection<T> entityList, int batchSize);

ServiceImpl源码:

java 复制代码
    @Transactional(
        rollbackFor = {Exception.class}
    )
    public boolean saveBatch(Collection<T> entityList, int batchSize) {
        String sqlStatement = this.getSqlStatement(SqlMethod.INSERT_ONE);
        return this.executeBatch(entityList, batchSize, (sqlSession, entity) -> {
            sqlSession.insert(sqlStatement, entity);
        });
    }

底层支持增强改造:

1、创建自定义sql注入类:MySqlInjector.java
java 复制代码
public class MySqlInjector extends DefaultSqlInjector {
    public MySqlInjector() {
    }

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);

        methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));
        return methodList;
    }


}
2、创建自定义Mapper MyBaseMapper.java
java 复制代码
public interface MyBaseMapper<T> extends BaseMapper<T> {
    /**
     * 批量插入 仅适用于mysql
     *
     * @param entityList 实体列表
     * @return 影响行数
     */
    Integer insertBatchSomeColumn(Collection<T> entityList);
}
3、业务Mapper实现自定义的Mapper
java 复制代码
@Repository
public interface TestMapper extends MyBaseMapper<Test>
{


}
4、业务中批量插入,使用insertBatchSomeColumn函数
java 复制代码
insertBatchSomeColumn(list);
5、新建MyBatisPlus配置类,将自定义sql注入 MybatisPlusConfig.java
java 复制代码
@Configuration
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //指定使用数据库类型
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return interceptor;
    }


    @Bean
    public DefaultSqlInjector mySqlInjector() {
        return new MySqlInjector();
    }

}

在使用默认MybatisPlus配置默认 sessionFactory时,以上即可

此处基于若依,需要将自定义sessionFactory设置为自定义sql注入器

配置文件位置,参考

framwork模块下config包MyBatisConfig

java 复制代码
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception
    {
        String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage");
        String mapperLocations = env.getProperty("mybatis.mapperLocations");
        String configLocation = env.getProperty("mybatis.configLocation");
        typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage);
        VFS.addImplClass(SpringBootVFS.class);

        final MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setTypeAliasesPackage(typeAliasesPackage);
        sessionFactory.setMapperLocations(resolveMapperLocations(StringUtils.split(mapperLocations, ",")));
        sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation));

        //自定义批量插入
        GlobalConfig globalConfig = new GlobalConfig();
        GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
        globalConfig.setDbConfig(dbConfig);
        globalConfig.setSqlInjector(new MySqlInjector());
        sessionFactory.setGlobalConfig(globalConfig);

        return sessionFactory.getObject();
    }

基于以上,大功告成。快去试试效果吧

相关推荐
程序员侠客行11 小时前
Mybatis连接池实现及池化模式
java·后端·架构·mybatis
老毛肚15 小时前
手写mybatis
java·数据库·mybatis
爱学英语的程序员20 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
阿杰真不会敲代码1 天前
Mybatis-plus入门到精通
java·tomcat·mybatis
侠客行03171 天前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
老毛肚1 天前
MyBatis体系结构与工作原理 上篇
java·mybatis
独断万古他化2 天前
【SSM开发实战:博客系统】(三)核心业务功能开发与安全加密实现
spring boot·spring·mybatis·博客系统·加密
fengxin_rou2 天前
[Redis从零到精通|第四篇]:缓存穿透、雪崩、击穿
java·redis·缓存·mybatis·idea·多线程
老毛肚2 天前
MyBatis插件原理及Spring集成
java·spring·mybatis
马尔代夫哈哈哈3 天前
MyBatis 入门与实战:从配置到CRUD一站式指南
mybatis