Mybatis-plus原生pages分页未生效的解决方案

 更新时间:2024年07月11日 10:45:14   作者:ybb_ymm  
本文主要介绍了Mybatis-plus原生pages分页未生效的解决方案,包含介绍了未生效的5种原因以及解决方法,具有一定的参考价值,感兴趣的可以了解一下

前言

前端小伙伴今天问我们后端同学,说他写得列表有问题,分页数据没有成功,将所有数据都返回给前端了!

后端同学有些懵逼的说,我已经使用了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分页未生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 实体类或对象序列化时,忽略为空属性的操作

    实体类或对象序列化时,忽略为空属性的操作

    这篇文章主要介绍了实体类或对象序列化时,忽略为空属性的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 关于Java中方法引用的示例

    关于Java中方法引用的示例

    方法引用可以认为是Lambda表达式的一种特殊形式,Lambda表达式可以让开发者自定义抽象方法的实现代码,方法引用则可以让开发者直接引用已存在的实现方法,作为Lambda表达式的Lambda体(参数列表得一致),需要的朋友可以参考下
    2023-05-05
  • JAVA深入探究之Method的Invoke方法

    JAVA深入探究之Method的Invoke方法

    这篇文章主要给大家介绍了关于JAVA深入探究之Method的Invoke方法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详细介绍idea如何设置类头注释和方法注释(图文)

    详细介绍idea如何设置类头注释和方法注释(图文)

    本篇文章主要介绍了idea如何设置类头注释和方法注释(图文),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • SpringBoot配置主从数据库实现读写分离

    SpringBoot配置主从数据库实现读写分离

    现在的 Web 应用大都是读多写少,本文主要介绍了SpringBoot配置主从数据库实现读写分离,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • java.net.SocketException: Connection reset 解决方法

    java.net.SocketException: Connection reset 解决方法

    最近纠结致死的一个java报错java.net.SocketException: Connection reset 终于得到解决
    2013-03-03
  • Spring中@ControllerAdvice注解的用法解析

    Spring中@ControllerAdvice注解的用法解析

    这篇文章主要介绍了Spring中@ControllerAdvice注解的用法解析,顾名思义,@ControllerAdvice就是@Controller 的增强版,@ControllerAdvice主要用来处理全局数据,一般搭配@ExceptionHandler、@ModelAttribute以及@InitBinder使用,需要的朋友可以参考下
    2023-10-10
  • Mybatis-Plus支持GBase8s分页查询的实现示例

    Mybatis-Plus支持GBase8s分页查询的实现示例

    本文主要介绍了使 Mybatis-Plus 支持 GBase8s 的分页查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • WxJava微信公众号开发入门实战

    WxJava微信公众号开发入门实战

    本文主要介绍了WxJava微信公众号开发入门实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java Map双列集合使代码更高效

    Java Map双列集合使代码更高效

    这篇文章主要介绍了Java Map双列集合使用,使你的代码更高效,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12

最新评论