SpringBoot使用Mybatis-Plus中分页插件PaginationInterceptor详解

 更新时间:2025年07月15日 09:49:44   作者:秋分的秋刀鱼  
文章介绍SpringBoot高版本中使用MyBatisPlusInterceptor替代旧分页插件,需配置多个InnerInterceptor功能模块(如分页、多租户、动态表名等),并强调插件顺序和mapper.xml中SQL语句不能以分号结尾,以避免分页语法错误

1 配置分页插件

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

在高版本的SpringBoot中, 会提示这种写法已过时, 所以采用另一种写法 MybatisPlusInterceptor , 如下:

@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
    return interceptor;
}

1.1 MybatisPlusInterceptor

该插件是核心插件,目前代理了 Executor#query 和 Executor#update 和 StatementHandler#prepare 方法

1.1.1 属性

private List<InnerInterceptor> interceptors = new ArrayList<>();

1.1.2 InnerInterceptor

  • 我们提供的插件都将基于此接口来实现功能 目前已有的功能: 自动分页: PaginationInnerInterceptor 多租户:
  • TenantLineInnerInterceptor 动态表名: DynamicTableNameInnerInterceptor 乐观锁:
  • OptimisticLockerInnerInterceptor sql性能规范: IllegalSQLInnerInterceptor
  • 防止全表更新与删除: BlockAttackInnerInterceptor 注意: 使用多个功能需要注意顺序关系,建议使用如下顺序 多租户
  • 动态表名 分页,乐观锁 sql性能规范,防止全表更新与删除 总结: 对sql进行单次改造的优先放入,不对sql进行改造的最后放入

2 编写Mapper及其对应的mapper.xml文件

@Mapper
public interface UserMapper extends BaseMapper<User> {
    List<User> findPageUsers(Page<User> page);
}
<select id="findPageUsers" resultType="org.wxmx.mybatis_plus_study.entity.User">
    select *
    from `user`
</select>

3 编写测试类

3.1 简单的分页查询

@SpringBootTest
class MybatisPlusStudyApplicationTests {
    @Resource
    UserMapper userMapper;
    @Test
    void contextLoads() {
        Page<User> page = new Page<>(1, 3);
        List<User> pageUsers = userMapper.findPageUsers(page);
        page.setRecords(pageUsers);
        System.out.println(page);
    }
}

运行结果:

JsqlParserCountOptimize sql=select *
        from `user`
==>  Preparing: SELECT COUNT(1) FROM `user`
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 9
==>  Preparing: select * from `user` LIMIT ?
==> Parameters: 3(Long)
<==    Columns: id, name, age
<==        Row: 39a773890a1b12b8a072c1be02ff3cdc, aaa, 12
<==        Row: 3b25fb904548c28b7ac6882d86c7ae5f, wdh, 12
<==        Row: 8b0397fcdfebe37d1d26175c17ed3725, wdh, 12
<==      Total: 3

3.2 带查询条件的分页查询

此方法是使用PaginationInterceptor 作为分页插件.

@Test
void contextLoads() {
    Page<User> page = new Page<>(1, 2);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "wdh");
    Page<User> page1 = userMapper.selectPage(page, queryWrapper);
   	page.setRecords(page1.getRecords()).getRecords().forEach(System.out::println);
}

运行结果:

JsqlParserCountOptimize sql=SELECT  id,name,age  FROM user 
 
 WHERE (name = ?)
==>  Preparing: SELECT COUNT(1) FROM user WHERE (name = ?)
==> Parameters: wdh(String)
<==    Columns: COUNT(1)
<==        Row: 5
==>  Preparing: SELECT id,name,age FROM user WHERE (name = ?) LIMIT ?
==> Parameters: wdh(String), 2(Long)
<==    Columns: id, name, age
<==        Row: 3b25fb904548c28b7ac6882d86c7ae5f, wdh, 12
<==        Row: 8b0397fcdfebe37d1d26175c17ed3725, wdh, 12
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6a0f2853]
User(id=3b25fb904548c28b7ac6882d86c7ae5f, name=wdh, age=12)
User(id=8b0397fcdfebe37d1d26175c17ed3725, name=wdh, age=12)

3.3 Page

简单分页模型, 有如下几个主要属性

/**
 * 查询数据列表
 */
protected List<T> records = Collections.emptyList();

/**
 * 总数
 */
protected long total = 0;

/**
 * 每页显示条数,默认 10
 */
protected long size = 10;

/**
 * 当前页
 */
protected long current = 1;

4 注意事项

在编写mapper.xml中的SQL语句的时候, 语句末尾不能使用 ; 结尾, 原因是在做分页的时候会在编写的SQL语句后面拼接上limit语句, 导致出现SQL语法错误(SQLSyntaxErrorException). 如下所示:

JsqlParserCountOptimize sql=select *
        from `user`;
==>  Preparing: SELECT COUNT(1) FROM `user`
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 9
==>  Preparing: select * from `user`; LIMIT ?
==> Parameters: 3(Long)
org.springframework.jdbc.BadSqlGrammarException: 
### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1
### The error may exist in org/wxmx/mybatis_plus_study/mapper/UserMapper.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select *         from `user`; LIMIT ?
### Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 3' at line 1
; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: You have an error in your SQL 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java中使用interrupt通知线程停止详析

    java中使用interrupt通知线程停止详析

    这篇文章主要介绍了java中使用interrupt通知线程停止详析,文章介绍的是使用interrupt来通知线程停止运行,而不是强制停止,详细内容需要的小伙伴可以参考一下
    2022-09-09
  • java数据结构之插入排序

    java数据结构之插入排序

    这篇文章主要为大家详细介绍了java数据结构之插入排序的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 深入理解Java中的栈从入门到精通(超详细)新手必看

    深入理解Java中的栈从入门到精通(超详细)新手必看

    本文详细介绍Java中栈的知识,先阐述栈的概念与后进先出特性,接着说明Java栈帧结构,还介绍了栈的应用、基本方法,以及基于数组、链表、队列等的实现方式,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • springboot集成es详解

    springboot集成es详解

    这篇文章主要介绍了springboot集成es,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Spring Boot的单例模式实现代码

    Spring Boot的单例模式实现代码

    Spring Boot里的单例不是GoF意义上的全JVM 唯一对象 + 私有构造器,而是由 Spring 容器管理的每个 ApplicationContext 仅一个实例,本文介绍Spring Boot的单例模式是如何实现的,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • DecimalFormat多种用法详解

    DecimalFormat多种用法详解

    这篇文章主要为大家详细介绍了DecimalFormat的多种用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java使用jdbc连接MySQL数据库实例分析

    Java使用jdbc连接MySQL数据库实例分析

    这篇文章主要介绍了Java使用jdbc连接MySQL数据库,结合实例形式分析了Java基于jdbc链接mysql的相关配置及工具类的定义相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • Java File类 mkdir 不能创建多层目录的解决

    Java File类 mkdir 不能创建多层目录的解决

    这篇文章主要介绍了Java File类 mkdir 不能创建多层目录的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 如何通过Maven仓库安装Spire系列的Java产品

    如何通过Maven仓库安装Spire系列的Java产品

    这篇文章主要介绍了如何通过Maven仓库安装Spire系列的Java产品,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • java字符串的重要使用方法以及实例

    java字符串的重要使用方法以及实例

    在本篇文章里小编给大家整理了关于java字符串的重要使用方法以及实例代码,需要的朋友们可以跟着学习参考下。
    2019-03-03

最新评论