Mybatis-plus原生pages分页未生效的解决方案
作者:ybb_ymm
前言
前端小伙伴今天问我们后端同学,说他写得列表有问题,分页数据没有成功,将所有数据都返回给前端了!
后端同学有些懵逼的说,我已经使用了service的pages接口来查询的列表,为什么失败了呢?
各位小伙伴,你们知道怎么解决这个问题吗?先考虑一下。
原因
1、Mybatis Plus版本的问题
当我们使用的是较旧的版本,可能存在分页失效的问题。
解决办法:升级到最新版本。
2、Mapper.xml文件中SQL语句格式问题
在Mapper.xml中书写SQL语句时,当格式错误了,就会导致分页失效。
正确的格式:在最后加上limit #{offset}, #{pageSize}
#{offset}:偏移量;
#{pageSize}:每页显示的数量。
3、Mybatis Plus默认分页拦截器问题
默认情况下,Mybatis Plus自带了一个分页插件com.baomidou.mybatisplus.plugins.PaginationInterceptor。但是,有时候在进行复杂查询时,这个分页插件可能会失效,导致分页查询不到数据。
4、分页参数传参问题
如果使用的是分页查询方法,那么在调用方法时就要传入Page对象,而且必须在此前调用setRecordsTotal方法设置总记录数。如果不设置总记录数,则分页插件无法工作。
5、分页配置的问题
不同版本的mybatis-plus需要的分页配置是不同的,是分水岭版本为3.4.0
在它之后的版本开始将原有的PaginationInterceptor 标记为过时,需要换成MybatisPlusInterceptor
解决方案
上面我们列出了5个导致分页结果失败的原因,接下来我们看看如何解决呢?分别一一对应来看。
1、升级对应的Mybatis-plus版本
如果我们使用的旧版本的Mybatis-plus,则可以升级为新版的。
在pom文件里面更新
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3</version> </dependency>
2、分页插件配置问题
这个可以按照上面所说的在Mapper.xml文件中调整
<select id="selectForPage" resultMap="BaseResultMap"> select * from tb_user <where> 1 = 1 </where> limit #{offset}, #{pageSize} </select>
配置Mybatis-plus分页插件,可以在application.yml文件中加入如下配置:
mybatis-plus: configuration: # 分页插件,一般不用修改 page-params: pageNum=1;pageSize=10;count=countSql
3、自定义分页拦截器
Mybatis-plus提供了自定义分页拦截器的功能,可以根据我们自己的业务进行自定义。自定义分页拦截器需要继承com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor类,然后在实现intercept方法,在该方法中来处理我们具体的分页逻辑。
例如:可以根据前端传入的分页参数进行分页,而不是使用默认的分页参数。具体代码示例如下:
public class CustomPaginationInterceptor extends PaginationInterceptor { @Override public Page SqlParserInterceptor(MappedStatement ms, Page page) { // 获取前端传入的分页参数 Integer pageNum = (Integer) page.get("pageNo"); Integer pageSize = (Integer) page.get("pageSize"); // 处理分页逻辑 int offset = (pageNum - 1) * pageSize; return super.SqlParserInterceptor(ms, new Page(offset, pageSize)); } }
4、正确的参数
假如在调用分页查询方法的时候没有传入Page对象或者是没有调用setRecordsTotal方法设置总条数,则分页查询不到数据。可以采用以下方式正确传参,具体代码如下:
// 分页查询方法 IPage<Test> pageTest = new Page<>(pageNo, pageSize); // 设置总记录数 pageTest .setRecordsTotal(testMapper.selectCount(null)); // 查询 IPage<Test> pageResult = testMapper.selectPage(pageTest , null);
5、不同版本的配置文件
接下来我们看看不同版本的配置文件具体如何实现
3.4.0之前版本
在启动类中添加Bean,配置类代码如下:
/** Mybatis plus 分页插件 **/ @Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false // paginationInterceptor.setOverflow(false); // 设置最大单页限制数量,默认 500 条,-1 不受限制 paginationInterceptor.setLimit(-1); return paginationInterceptor; }
3.4.0之后版本
配置类代码如下
package com.cafeteria.reservation.admin.config; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisConfig { @Bean public MybatisPlusInterceptor paginationInterceptor() { MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor(); //这是分页拦截器 PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); paginationInnerInterceptor.setOverflow(false); paginationInnerInterceptor.setMaxLimit(500L); mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor); //设置请求的页面大于最大页后操作,true调回到首页,false继续请求默认false // paginationInterceptor.setOverflow(false);//设置最大单页限制数量,默认500条,-1不受限制 //paginationInterceptor.setLimit(500); //开启 count 的 join 优化,只针对部分 left join return mybatisPlusInterceptor; } }
完结
到此这篇关于Mybatis-plus原生pages分页未生效的解决方案的文章就介绍到这了,更多相关Mybatis-plus原生pages分页未生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!