开发者

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

开发者 https://www.devze.com 2025-07-17 11:36 出处:网络 作者: 秋分的秋刀鱼
目录1 配置分页插件1.1 MyBATisPlusInterceptor1.1.1 属性1.1.2 InnerInterceptor2 编写Mapper及其对应的mapper.XML文件3 编写测试类3.1 简单的分页查询3.2 带查询条件的分页查询3.3 Page4 注意事项总结1 配置分页插
目录
  • 1 配置分页插件
    • 1.1 MyBATisPlusInterceptor
      • 1.1.1 属性
      • 1.1.2 InnerInterceptor
  • 2 编写Mapper及其对应的mapper.XML文件
    • 3 编写测试类
      • 3.1 简单的分页查询
        • 3.2 带查询条件的分页查询
          • 3.3 Page
          • 4 注意事项
            • 总结

              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"http://www.devze.com>
                  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<Use编程r> 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.SQLSyntaxErr编程客栈orException: 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 
              

              总结

              以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

              0

              精彩评论

              暂无评论...
              验证码 换一张
              取 消

              关注公众号