Mybatis-plus实现【真·批量插入】

7 篇文章 0 订阅
6 篇文章 0 订阅

Mybatis基本是现在最为常用的ORM(Object Relational Mapping,对象关系映射)框架,进行普通的CRUD非常方便。

一. BaseMapper

实体类对应的mapper在继承BaseMapper后,就可以使用以下Mybatis-plus提供的方法进行数据操作。

BaseMapper中默认提供一个insert()方法,仅支持数据的单条插入。如果有上万甚至数十万数据需要插入时,耗时过久。
在这里插入图片描述

二. IService

与BaseMapper相同,实体类对应接口在继承了IService后,可以调用其中提供的save()、saveBatch()进行插入操作。其中,saveBatch()入参为list,可以实现批量插入。
在这里插入图片描述
但是,saveBatch()方法实现的批量插入其实是伪批量,其底层实现仍然是一条条数据进行插入的。源码的解析就不贴了,有兴趣的小伙伴可以看一下这篇文章 ===>为什么说saveBatch是伪批量插入?

三. 通过添加mapper层选装件实现真正的批量插入

Mybatis-plus其实是有真正实现了批量插入的方法的,方法名是insertBatchSomeColumn()需要我们配合SQL注入器来开启。(可能是因为仅支持MySQL,所以作者没有将其设置为默认方法?)

开启insertBatchSomeColumn()可分为3个步骤:

1. 自定义SQL注入器

新建一个名为InsertBatchSqlInjector 的类,继承DefaultSqlInjector(当然,类名可以根据自己的喜好来)

public class InsertBatchSqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        methodList.add(new InsertBatchSomeColumn()); //添加InsertBatchSomeColumn方法
        return methodList;
    }
}
2. 将SQL注入器交给Spring容器

MybatisPlusConfig类中,将刚才创建的SQL注入器InsertBatchSqlInjector 注册为一个bean。

public class MybatisPlusConfig {
	// 其他内容,与当前话题无关

	@Bean
    public InsertBatchSqlInjector easySqlInjector() {
        return new InsertBatchSqlInjector();
    }
}
@Bean
public GlobalConfig globalConfig(@Qualifier("easySqlInjector") ISqlInjector easySqlInjector){
    GlobalConfig globalConfig = new GlobalConfig();
    globalConfig.setSqlInjector(easySqlInjector);
    return globalConfig;
}

这一步中,有一点需要注意。如果你的MybatisPlusConfig类中自定义了sqlSessionFactory,上面的配置不会被加载到,需要在sqlSessionFactory中进行设置

代码如下:

@Bean("sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("globalConfig") GlobalConfig globalConfig ) throws Exception {
    MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
        
	// 其他设置,与本话题无关

    //添加自定义sql注入接口
    sqlSessionFactory.setGlobalConfig(globalConfig);//添加自定义sql注入接口
    return sqlSessionFactory.getObject();
}
3. 配置MyBaseMapper继承BaseMapper

新建MyBaseMapper类,继承BaseMapper,并在此类中配置insertBatchSomeColumn()方法。

代码如下:

public interface MyBaseMapper<T> extends BaseMapper<T> {
    // 批量插入 仅适用于mysql
    Integer insertBatchSomeColumn(Collection<T> entityList);
}

然后,用业务Mapper继承MyBaseMapper就可以调用insertBatchSomeColumn()方法了。

当然,如果在你的项目中,仅仅有一两个类需要用到批量插入,那完全没必要抽取一个MyBaseMapper。直接用你的业务Mapper继承BaseMapper,并在对应业务Mapper中配置insertBatchSomeColumn()方法即可,代码同上。

参考文献:

  • 9
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值