批量插入
3.2.0版本中,IService有一个看着很迷惑人的一个方法
boolean saveBatch(Collection<T> entityList, int batchSize);
以为这个是批量插入,其实不然,跟随代码进入底层会发现:
public boolean saveBatch(Collection<T> entityList, int batchSize) {
String sqlStatement = this.sqlStatement(SqlMethod.INSERT_ONE);
SqlSession batchSqlSession = this.sqlSessionBatch();
Throwable var5 = null;
try {
int i = 0;
for(Iterator var7 = entityList.iterator(); var7.hasNext(); ++i) {
T anEntityList = var7.next();
batchSqlSession.insert(sqlStatement, anEntityList);
if (i >= 1 && i % batchSize == 0) {
batchSqlSession.flushStatements();
}
}
batchSqlSession.flushStatements();
return true;
} catch (Throwable var16) {
var5 = var16;
throw var16;
} finally {
if (batchSqlSession != null) {
if (var5 != null) {
try {
batchSqlSession.close();
} catch (Throwable var15) {
var5.addSuppressed(var15);
}
} else {
batchSqlSession.close();
}
}
}
}
其实还是一个for循环插入,由于项目使用的是3.2.0,使用这个方法插入,被领导疯狂吐槽,然后不得不用xml进行批量插入,坑爹呀。。。
反观3.4.0的批量插入:
需要手写一个注入器在配置类中:
注入器:
public class SqlInjector extends DefaultSqlInjector {
@Override
public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
List<AbstractMethod> methodList = super.getMethodList(mapperClass);
methodList.add(new InsertBatchSomeColumn());
return methodList;
}
}
@Configuration
public class MybatisPlusConfig {
@Bean
public SqlInjector sqlInjector(){
return new SqlInjector();
}
}
然后手写一个mapper,基于baseMapper
public interface MyBaseMapper<T> extends BaseMapper<T> {
/**
* 批量插入 仅适用于mysql
*
* @param entityList 实体列表
* @return 影响行数
*/
Integer insertBatchSomeColumn(Collection<T> entityList);
}
业务mapper在继承手写的mapper:
@Mapper
public interface MysqlDao extends MyBaseMapper<MysqlEntity> {
}
这样的话,就可以在业务代码中实现批量插入了,真正的毫秒级~但是仅仅限于MySQL。。
分页
在3.2.0版本中,分页可以直接写,举例:
public List<TestData> findPage(int startNum, int pageSize) {
IPage<TestData> page = new Page<>(startNum,pageSize);
QueryWrapper<TestData> wrapper = new QueryWrapper<>();
IPage<TestData> page1 = testDao.selectPage(page,wrapper);
List<TestData> dataList = page1.getRecords();
return dataList;
}
在3.4.0中,还是同样的方法,发现每次不管传递的分页参数是多少,都只查询出500条:
原来在底层中,将条数进行了限制:
同样,在3.4.0版本中,要想使用分页功能,也需要将对应的注入器加入配置类来实现:
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//向Mybatis过滤器链中添加分页拦截器
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
//还可以添加他的拦截器
return interceptor;
}
这样就可以继续使用3.2.0版本的分页功能了。。
后续如果有其他的坑再分类整理~