likes
comments
collection
share

MyBatis-Plus 分页失效了吗❓通过Springboot 集成 Mybatis-plus 进行实现列表分页功能。

作者站长头像
站长
· 阅读数 27

引言

天下难事,必做于易;天下大事,必做于细。

注意细节,才能在生活中找到微小的幸福。

事情经过

随后在项目开发过程中,也使用了这种方式,主要目的就是不想写sql,想偷次懒。在完成的过程中真叫一个爽,我直接就在 Controller 里面调用 service 直接就完成分页操作了,静静的等待前端妹子和我调试接口。

就这样等着等着,我就摸着摸着 . . . . . .

由于剩下的接口不多了,上周六临时决定过来加班了。中间也就修改了几个小问题,直到下午五点多,前端妹子发过来问题说,分页功能有问题,当到第二页的时候还是返回第一页的数据。心想着不可能呀,Mybatis-plus 肯定对分页进行处理了,怀着怀疑的心态打开代码准备运行复现。

问题复现

数据库里面有10条数据,每页显示5条。

MyBatis-Plus 分页失效了吗❓通过Springboot 集成 Mybatis-plus 进行实现列表分页功能。

打开之前的测试代码,设置页码和数量(第2页,每一页5条数据)

@Override
public IPage<User> getUserPage() {
    //构建分页模型,拼装参数(第3页,每一页5条数据)
    Page page = new Page<>(2, 5);
    //执行分页查询,返回对应实体类分页
    return userMapper.selectPage(page,new LambdaQueryWrapper<>());
}

运行过程中的sql: MyBatis-Plus 分页失效了吗❓通过Springboot 集成 Mybatis-plus 进行实现列表分页功能。

第二页是可以获取到数据的,并且就是需要的第二页的数据。

于是在执行一次获取第三页的数据 MyBatis-Plus 分页失效了吗❓通过Springboot 集成 Mybatis-plus 进行实现列表分页功能。 根据执行结果来说,当第三页的时候,返回的是第一页的数据。

正常来说,第二页能获取到数据证明分页功能是没问题的;第三页没有的话是不执行查询列表sql的,结果执行了,证明那块配置有问题。

怀着这样的疑问,检查了一遍配置,感觉是没有问题的。感觉有点怀疑 Mybatis-plus 是不是就是这样的呢,不可能要改变写法,再去写sql吧! MyBatis-Plus 分页失效了吗❓通过Springboot 集成 Mybatis-plus 进行实现列表分页功能。

还是抱着怀疑的态度,找寻着解决方式. . . . . .

看着时间已经马上六点了,马上下班了。这样吧,死马当活马医,改变之前配置Mybaits-plus进行配置config的方法。

@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

执行sql结果

MyBatis-Plus 分页失效了吗❓通过Springboot 集成 Mybatis-plus 进行实现列表分页功能。

这个时候,当是第三页的话,只有一个执行查询数量的sql。这下证明之前的配置是有问题的。

回到之前的配置

@Configuration
public class MybatisPlusConfig {
    /**
     * 新的插件配置
     * PaginationInnerInterceptor分页一缓和二缓遵循mybatis的规则 PaginationInnerInterceptor
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 配置分页插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setOverflow(true);
        paginationInnerInterceptor.setMaxLimit(1000L);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        return interceptor;
    }
}

中间有个属性, paginationInnerInterceptor.setOverflow(true);。 这个解释为:设置请求的页面大于最大页操作,true回到首页, false(默认)继续请求。 简单理解为:当分页的页码大于总页码的时候,设置true就会返回第一页的数据,反之就不会返回。

然后,就把这个属性去掉了,或者也可设置成 false ,效果是一样的。

其实,还有一种方式,当第三页的时候,分页中返回当前页current=1,也可根据这个进行判断进行处理。

执行一遍,没有问题,上代码下班!!!

总结

可见,一个小小的细节不注意,就会出现问题。

虽然一直在使用,还是对有些技术研究太浅。在后期的工作中,还得多学多练多看才行!

展望

人生的道路上,从来没有全身而退。

人生没有多走的路,每走一步都是进步。

转载自:https://juejin.cn/post/7408696730801209356
评论
请登录