解决mybatis-plus 拦截器不生效--分页插件不生效

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 本文介绍了在使用 Mybatis-Plus 进行分页查询时遇到的问题及解决方法。依赖包包括 `mybatis-plus-boot-starter`、`mybatis-plus-extension` 等,并给出了正确的分页配置和代码示例。当分页功能失效时,需将 Mybatis-Plus 版本改为 3.5.5 并正确配置拦截器。

依赖包版本

com.baomidou:mybatis-plus-boot-starter:jar:3.5.5

com.baomidou:mybatis-plus-extension:jar:3.5.5

com.github.pagehelper:pagehelper-spring-boot-starter:jar:2.0.0

com.github.jsqlparser:jsqlparser:jar:4.5

com.github.pagehelper:sqlparser4.5:jar:6.1.0


参考文档: 官方分页插件  Mybatis-Plus分页不生效的一些原因总结_mybatisplus 分页不生效-CSDN博客  mybatisplus github.pagehelper的 jsqlparser冲突 - CSDN文库   MybatisPlus 分页查询不生效,拦截器无效的解决方案_mybatisplus拦截器不生效-CSDN博客  升级到最新版本后出现PageHelperAutoConfiguration Bad return type


现象


使用 `getMapper().selectPage(pagePlus, queryWrapper)` 查询时,没有分页,即SQL里面没有limit,同时也没有查询总条数,即 total为0;


public Page<T> selectPage(T entity, Page<T> page) {
        com.baomidou.mybatisplus.extension.plugins.pagination.Page<T> pagePlus =
                new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(page.getPageNum(), page.getPageSize());

        QueryWrapper<T> queryWrapper = new QueryWrapper<>(entity);
        queryWrapper.orderBy(StringUtils.isNotEmpty(page.getOrderBy())
                , page.getIsAsc().equals(SqlKeyword.ASC.getSqlSegment()), page.getOrderBy());

        com.baomidou.mybatisplus.extension.plugins.pagination.Page<T> tPage
                = getMapper().selectPage(pagePlus, queryWrapper);

        if (ObjectUtil.isNotNull(tPage)) {
            return new Page<>(tPage.getRecords(), tPage.getTotal());
        }
        return Page.empty();
    }



解决方法

  1. 把mybatis-plus相关依赖包的版本由3.5.7 改为3.5.5 ,(com.baomidou:mybatis-plus-boot-starter:jar:3.5.5)
  2. 修改mybatis 配置类,设置拦截器的方法不对.

old(有问题/错误):

sqlSessionFactoryBean.setPlugins(mybatisPlusInterceptor);


解决之后:

 SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
        org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();
        if (mybatisPlusInterceptor != null) {
            configuration.addInterceptor(mybatisPlusInterceptor);
        }
  1. 去掉application.properties中的 `pagehelper.helperDialect=mysql` --解决  Invocation of init method failed; nested exception is java.lang.VerifyError: Bad return type

参考:

升级到最新版本后出现PageHelperAutoConfiguration Bad return type

Xnip 2024-09-17 12.27.14.png


完整代码:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(PaginationInnerInterceptor paginationInnerInterceptor) {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(paginationInnerInterceptor/*new PaginationInnerInterceptor(DbType.MYSQL)*/); // 根据你的数据库类型选择
    return interceptor;
}

    @Bean
    public PaginationInnerInterceptor getPaginationInnerInterceptor() {
        return new PaginationInnerInterceptor(DbType.MYSQL);
    } 

@Bean(name = "sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(/*@Autowired*/ DataSource dataSource
                                               /*@Value("classpath:mybatis-config.xml") Resource configLocation,
                                               @Value("classpath:sqlmapper/*Mapper.xml") Resource[] mapperLocations*/, MybatisPlusInterceptor mybatisPlusInterceptor) throws Exception {
        MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

        //mapperLocation配置
        Resource[] resourcesWms = resolver.getResources("classpath*:/mapper/*Mapper.xml");
        Resource[] resourcesGform = resolver.getResources("classpath*:com//jobbook/mapper/xml/*Mapper.xml");
        Resource[] resourcesruoyiSys = resolver.getResources("classpath*:mapper/bbb/*Mapper.xml");
        Resource[] resourcesruoyiFlow = resolver.getResources("classpath*:mapper/ccc/*Mapper.xml");
        List<Resource> resourceList = Lists.newArrayList(resources);
//        resourceList.addAll(Arrays.asList(resourcesWms));
        resourceList.addAll(Arrays.asList(resourcesGform));
        resourceList.addAll(Arrays.asList(resourcesruoyiSys));
        resourceList.addAll(Arrays.asList(resourcesruoyiFlow));

        sqlSessionFactoryBean.setMapperLocations(resourceList.toArray(new Resource[]{}));
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
        org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();
        if (mybatisPlusInterceptor != null) {
            configuration.addInterceptor(mybatisPlusInterceptor);
        }

//        sqlSessionFactoryBean.setPlugins(mybatisPlusInterceptor);

        // 取得类型转换注册器
        TypeHandlerRegistry typeHandlerRegistry = sqlSessionFactory.getConfiguration().getTypeHandlerRegistry();
        // 注册默认枚举转换器
        typeHandlerRegistry.setDefaultEnumTypeHandler(org.apache.ibatis.type.EnumTypeHandler.class);
        return sqlSessionFactoryBean.getObject();
    }

分页SQL示例

   [com.industri.jobbook.aop.FlowDAOAop:process:31] - FlowDAOAop before: selectPage, args: [{"nodeList":[],"userList":[]},{"isAsc":"desc","orderBy":"create_time","pageNum":0,"pageSize":1,"total":0}]
2024-09-17 12:28:35.222 INFO  [traceId: ]-[http-nio-8080-exec-1]
                [com.alibaba.druid.pool.DruidDataSource:init:928] - {dataSource-1} inited
2024-09-17 12:28:40.909 DEBUG [traceId: ]-[http-nio-8080-exec-1]
                [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:debug:135] - ==>  Preparing: SELECT COUNT(*) AS total FROM flow_definition WHERE del_flag = '0'
2024-09-17 12:28:40.933 DEBUG [traceId: ]-[http-nio-8080-exec-1]
                [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:debug:135] - ==> Parameters: 
2024-09-17 12:28:41.482 DEBUG [traceId: ]-[http-nio-8080-exec-1]
                [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:debug:135] - <==      Total: 1
2024-09-17 12:28:41.486 DEBUG [traceId: ]-[http-nio-8080-exec-1]
                [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:debug:135] - ==>  Preparing: SELECT id,create_time,update_time,tenant_id,del_flag,flow_code,flow_name,version,is_publish,form_custom,form_path,activity_status,listener_type,listener_path,ext FROM flow_definition WHERE del_flag='0' ORDER BY create_time DESC LIMIT ?
2024-09-17 12:28:41.487 DEBUG [traceId: ]-[http-nio-8080-exec-1]
                [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:debug:135] - ==> Parameters: 1(Long)
2024-09-17 12:28:42.017 DEBUG [traceId: ]-[http-nio-8080-exec-1]
                [org.apache.ibatis.logging.jdbc.BaseJdbcLogger:debug:135] - <==      Total: 1





相关文章
|
1月前
|
SQL Java 数据库连接
深入 MyBatis-Plus 插件:解锁高级数据库功能
Mybatis-Plus 提供了丰富的插件机制,这些插件可以帮助开发者更方便地扩展 Mybatis 的功能,提升开发效率、优化性能和实现一些常用的功能。
197 26
深入 MyBatis-Plus 插件:解锁高级数据库功能
|
29天前
|
SQL Java 数据库连接
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
MyBatis-Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。本文讲解了最新版MP的使用教程,包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段等核心功能。
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
70 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
3月前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
2月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
142 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
2月前
|
前端开发 Java Apache
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
本文详细讲解了如何整合Apache Shiro与Spring Boot项目,包括数据库准备、项目配置、实体类、Mapper、Service、Controller的创建和配置,以及Shiro的配置和使用。
489 1
Springboot整合shiro,带你学会shiro,入门级别教程,由浅入深,完整代码案例,各位项目想加这个模块的人也可以看这个,又或者不会mybatis-plus的也可以看这个
|
2月前
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
26 0
mybatis使用二:springboot 整合 mybatis,创建开发环境
|
2月前
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
141 1
|
3月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)