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()
方法即可,代码同上。