首页 > 基础资料 博客日记
MyBatisPlus分页查询限制500条
2024-09-11 20:00:07基础资料围观113次
Java资料网推荐MyBatisPlus分页查询限制500条这篇文章给大家,欢迎收藏Java资料网享受知识的乐趣
问题起因
近期在配合前端大哥产出项目的时候遇到了这样一个问题:
- 前端大哥:请求分页给你传 pageNum=1,pageSize=99999。你给我把所有数据全都捞出来。
- 我:小意思,ok!
- …十分钟后…
- 前端大哥:不对啊,项目中怎么我查询不到我刚添加的内容啊???
- 我:wc!!!???(我 carry !!!???)
- 进行排查,现在pageSize为99999,捞出数据库所有数据,我直接对我操作的表一个select count(*),哎~只有570条记录。不应该啊,查这个数据不是绰绰有余?debug一看,坏了这个分页怎么只查出500条,XXOO!
如图所示:
这不就开始找问题了嘛,有度娘问度娘!有GPT问GPT!
排查问题
- 为什么没有查询到刚刚添加的内容呢?
- 因为刚刚插入的排序在最后面,分页查询查询了前500条。所以现在需要让传入的pageSize生效。
- 什么东西会去限制哥们刚刚new出来的新鲜Page对象呢?
- 经过我询问过度娘之后,发现是这货《PaginationInterceptor》拦截器!在配置文件配制了这哥们之后,它就把分页默认限制在500条了。给兄弟们看看源码~
package com.baomidou.mybatisplus.extension.plugins;
...省略导入包的内容...太长了,感兴趣的兄弟们可以去苞米豆里看看这个拦截器
/**
1. 分页拦截器
2. @author hubin
3. @since 2016-01-23
*/
@Setter
@Accessors(chain = true)
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class PaginationInterceptor extends AbstractSqlParserHandler implements Interceptor {
/**
* 单页限制 500 条,小于 0 如 -1 不受限制
*/
protected long limit = 500L;
@Override
public Object intercept(Invocation invocation) throws Throwable {
......兄弟们估计不爱看这些花里胡哨的,主要是下面这个方法..其他省略......
/*
* 不需要分页的场合,如果 size 小于 0 返回结果集
*/
if (null == page || page.getSize() < 0) {
return invocation.proceed();
}
if (this.limit > 0 && this.limit <= page.getSize()) {
//处理单页条数限制 超过就给size设置limit的值
handlerLimit(page);
}
......兄弟们估计不爱看这些花里胡哨的,主要是上面这个两个if语句..其他省略......
}
/**
* 处理超出分页条数限制,默认归为限制数
*
* @param page IPage
*/
protected void handlerLimit(IPage<?> page) {
page.setSize(this.limit);
}
}
解决方法
看了上面的方法,了解到当满足null == page || page.getSize() < 0这个条件的时候就不去搞分页操作了。那山人就有了方法A这条妙计了。那么有张良计就有过墙梯,还有一个B方法,就是当我设置page对象的size超过limit的时候,把limit的值赋值给size,如果limit=500,size=570,那就设置size = limit = 500;我给这个limit数据拉大不就好了。
解决方法A
新new出Page这个对象之后,它是不为空的,那我只需要设置page对象的size小于0,只要小于0,那就不会分页。代码如下
@Override
public IPage<UserInfo> getAllUserInfo(Integer pageNum, Integer pageSize) {
LambdaQueryWrapper<UserInfo> userWrapper = new LambdaQueryWrapper<>();
userWrapper.eq(UserInfo::getDisable,0);
//*******实际就是以下代码**********
Page<UserInfo> userPage = new Page<>(pageNum, -1);
//*******实际就是以上代码**********
Page<UserInfo> pageResult = userInfoMapper.selectPage(userPage,userWrapper);
return pageResult;
}
如图所示:
解决方法B
从PaginationInterceptor拦截器入手,你小子不是默认限制500条嘛,还不能超过你,超过你,你就把我的值给覆盖了。我给你拦截器的limit按照我的需求设置。✌给你limit设置给1000,我要570,570<1000,你给我把我需要的数据都传出来。代码如下:
//写一个配置类 并将其注册到spring容器中 然后给拦截器自定义我们需要的limit值
@Configuration
public class MyBatisPlusConfig {
@Bean
public PaginationInterceptor mybatisPlusInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setLimit(1000);
return paginationInterceptor;
}
}
结果如图:
大体总结:要么 new Page<>(pageNum,PageSize);的时候给pageSize设置负值,要么给拦截器PaginationInterceptor 自定义设置合适的limit。
这样问题就解决了,若有问题可以与我交流,谢谢阅读!
文章来源:https://blog.csdn.net/qq_37685626/article/details/141004316
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签: