Mybatis-Plus 3.2.0与3.4.0的坑

26 篇文章 0 订阅

批量插入

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版本的分页功能了。。

后续如果有其他的坑再分类整理~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值