1.说明

MyBatis使用分页查询功能,
需要配置分页插件,
如果没有配置,
则分页功能不生效。

2.分页查询API

下面列举了两个内置的分页查询API,
使用这些API时需要配置分页插件,
当然也可以自定义分页查询API:

com.baomidou.mybatisplus.extension.service.IService.page(E, Wrapper<T>)
/*** 翻页查询** @param page         翻页对象* @param queryWrapper 实体对象封装操作类 {@link com.baomidou.mybatisplus.core.conditions.query.QueryWrapper}*/
default <E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper) {return getBaseMapper().selectPage(page, queryWrapper);
}
com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(P, Wrapper<T>)
/*** 根据 entity 条件,查询全部记录(并翻页)** @param page         分页查询条件(可以为 RowBounds.DEFAULT)* @param queryWrapper 实体对象封装操作类(可以为 null)*/
<P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

可以看到IService.page()实际使用的也是BaseMapper.selectPage()。

3.配置分页插件

新增配置类MybatisPlusConfig.java如下:

package com.yuwen.spring.demo.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// MyBatis Plus分页插件MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

另外旧版的配置如下,
用作配置参考:

@Bean
public PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false// paginationInterceptor.setOverflow(false);// 设置最大单页限制数量,默认 500 条,-1 不受限制// paginationInterceptor.setLimit(500);// 开启 count 的 join 优化,只针对部分 left joinpaginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));return paginationInterceptor;
}

4.使用分页查询

批量查询用户支持分页参数,
pageNum代表当前页数,
pageSize代表每页大小,
分页查询代码如下:

public List<UserEntity> queryBatchUser(Integer pageNum, Integer pageSize) {if (pageNum == null) {pageNum = 1;}if (pageSize == null) {pageSize = Integer.MAX_VALUE;}IPage<UserEntity> page = new Page<UserEntity>();page.setCurrent(pageNum);page.setSize(pageSize);// 返回的pageNew和page是同一个对象IPage<UserEntity> pageNew = userService.page(page);List<UserEntity> records = pageNew.getRecords();return records;
}

5.分页查询结果

执行分页查询请求:

http://IP:Port/userProject/controller/user/batch?pageNum=2&pageSize=2

输出查询日志如下,
发现后台执行了2条SQL,
第1条是查询用户总数,
第2条是真正的分页查询:

17:23:36.333 [http-nio-8088-exec-6] DEBUG [com.yuwen.spring.demo.aspect.WebLogAspect.around(WebLogAspect.java:34)] - UserControllerImpl.queryBatchUser(..) start, request=[null, 2, 2]
17:23:36.336 [http-nio-8088-exec-6] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - ==>  Preparing: SELECT COUNT(*) AS total FROM tbl_user
17:23:36.337 [http-nio-8088-exec-6] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - ==> Parameters:
17:23:36.341 [http-nio-8088-exec-6] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - <==      Total: 1
17:23:36.342 [http-nio-8088-exec-6] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - ==>  Preparing: SELECT id,`name`,email,birthday,create_time,update_time FROM tbl_user LIMIT ?,?
17:23:36.343 [http-nio-8088-exec-6] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - ==> Parameters: 2(Long), 2(Long)
17:23:36.348 [http-nio-8088-exec-6] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - <==      Total: 2
17:23:36.349 [http-nio-8088-exec-6] DEBUG [com.yuwen.spring.demo.aspect.WebLogAspect.around(WebLogAspect.java:46)] - UserControllerImpl.queryBatchUser(..) end, result=[UserEntity [id=1991, name=yuwen, email=yuwen3@asiainfo.com, birthday=1989-06-30, createTime=2021-11-25 11:22:26, updateTime=null], UserEntity [id=1992, name=yuwen, email=yuwen3@asiainfo.com, birthday=1989-06-30, createTime=2021-11-25 11:22:34, updateTime=null]]

6.pageNum=0的情况

当设置pageNum为0时,
查询返回结果和pageNum为1时相同,
代码中对pageNum的处理如下:

com.baomidou.mybatisplus.core.metadata.IPage.offset()
/*** 计算当前分页偏移量*/
default long offset() {long current = getCurrent();if (current <= 1L) {return 0L;}return Math.max((current - 1) * getSize(), 0L);
}

可以看出,对应pageNum小于等于1时,
查询返回结果都是和pageNum=1相同,
所以这里建议pageNum从1开始,不要使用0及负数。

7.pageNum≥1的情况

实际测试中,
以MySQL为例,
pageNum为大于等于1的时候,
会影响分页查询的生成的SQL。

7.1.pageNum=1时的分页查询SQL

[org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - ==>  Preparing: SELECT id,`name`,email,birthday,create_time,update_time FROM tbl_user LIMIT ?
17:31:44.412 [http-nio-8088-exec-9] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - ==> Parameters: 2(Long)

7.2.pageNum>1时的分页查询SQL

17:23:36.342 [http-nio-8088-exec-6] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - ==>  Preparing: SELECT id,`name`,email,birthday,create_time,update_time FROM tbl_user LIMIT ?,?
17:23:36.343 [http-nio-8088-exec-6] DEBUG [org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:137)] - ==> Parameters: 2(Long), 2(Long)

7.3.代码解析

可以看到MySql分页实现的处理,
当offset为0时,即pageNum=1时,
对应不使用offset,
其他情况会使用offset,
可以和上面生成的SQL对应起来:

package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;/*** MYSQL 数据库分页语句组装实现** @author hubin* @since 2016-01-23*/
public class MySqlDialect implements IDialect {@Overridepublic DialectModel buildPaginationSql(String originalSql, long offset, long limit) {StringBuilder sql = new StringBuilder(originalSql).append(" LIMIT ").append(FIRST_MARK);if (offset != 0L) {sql.append(StringPool.COMMA).append(SECOND_MARK);return new DialectModel(sql.toString(), offset, limit).setConsumerChain();} else {return new DialectModel(sql.toString(), limit).setConsumer(true);}}
}

8.参考文章

MyBatis-Plus分页插件mybatis-plus-sample-pagination


http://www.taodudu.cc/news/show-1250943.html

相关文章:

  • SNMP客户端工具MIB Browser
  • PowerDesigner运行自定义VBS脚本,复制Name到Comment
  • BitMap-BitSet(JDK1.8)基本使用入门
  • IDEA查看Java类的UML关系图
  • 30. 包含min函数的栈
  • 35. 复杂链表的复制
  • 58 - II. 左旋转字符串
  • 03. 数组中重复的数字
  • 53 - II. 0~n-1中缺失的数字
  • 04. 二维数组中的查找
  • 11. 旋转数组的最小数字
  • 50. 第一个只出现一次的字符
  • 32 - I. 从上到下打印二叉树
  • 32 - II. 从上到下打印二叉树 II
  • 32 - III. 从上到下打印二叉树 III
  • 26. 树的子结构
  • PostgreSQL数据库密码
  • SpringBoot中使用Hibernate Validator校验工具类
  • 28. 对称的二叉树
  • 解决tomcat的undeploy
  • 解决eclipse出现The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path
  • 下载安装neo4j
  • vue-drag-resize实线页面的拖拽与缩放
  • 解决IDEA不能编译XML文件
  • 播放视频和音频文件java
  • 实时获取屏幕大小
  • vue部分样式无法修改
  • vue中根据搜索内容跳转到页面指定位置
  • Duplicate entry ‘‘ for key ‘***‘
  • transferto遇到的问题java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp

SpringBoot集成MyBatis-Plus分页插件相关推荐

  1. SpringBoot集成MyBatis的分页插件PageHelper(回头草)

    俗话说:好?不吃回头草,但是在这里我建议不管你是好马还是不好马,都来吃吃,带你复习一下分页插件PageHelper. 昨天给各位总结了本人学习springboot整合mybatis第一阶段的一些学习心 ...

  2. SpringBoot集成MyBatis的分页插件PageHelper

    [写在前面] 项目的后台管理系统需要展示所有资源信息,select * 虽然方便但数据量过于庞大会严重降低查找效率,页面加载慢,用户体验差.分页自然是必要选择,但原生的方法过于繁杂.MyBatis的分 ...

  3. Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper

    1. 概述 本文的内容包括如下内容: Spring Boot集成mybatis Spring Boot集成pagehelper分页插件,定义分页的相关类 实现工具类:model转dto,实现数据层和传 ...

  4. Springboot集成mybatis通用Mapper与分页插件PageHelper

    Springboot集成mybatis通用Mapper与分页插件PageHelper 插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 ...

  5. Spring Boot2.0 整合mybatis、分页插件、druid

    2019独角兽企业重金招聘Python工程师标准>>> 前言 本文主要是针对SpringBoot2.0.2版本,实现整合mybatis.分页插件.druid等组件,实现完整的web服 ...

  6. SpringBoot----[16]—SpringBoot集成MyBatis

    SpringBoot----[16]-SpringBoot集成MyBatis 集成Mybatis 新建maven project 新建一个maven project,取名为:spring-boot-m ...

  7. SpringBoot集成Mybatis项目实操

    本文为<从零打造项目>系列第三篇文章,首发于个人网站. <从零打造项目>系列文章 比MyBatis Generator更强大的代码生成器 SpringBoot项目基础设施搭建 ...

  8. SpringBoot集成Mybatis Plus

    Mybatis Plus是Mybatis的升级版本,提供一些默认的功能实现,只要按照其约定编写代码,就可以充分利用其特性. SpringBoot集成Mybatis Plus步骤: 每个实体类定义一套M ...

  9. SpringBoot教程(十一) | SpringBoot集成Mybatis

    上一篇文章我们介绍了SpringBoot集成JdbcTemplate.简单体验了一下JdbcTemplate框架的用法,今天的内容比较重要,我们来介绍一下SpringBoot集成Mybatis的步骤. ...

  10. SpringBoot——SpringBoot集成MyBatis

    目录 1 SpringBoot集成MyBatis 1.1 准备工作 1.2 pom.xml文件 1.3 核心配置文件(application.properties) 1.4 GeneratorMapp ...

最新文章

  1. input反应慢 vue_Vue v-model实时更新带来的输入框卡顿问题
  2. java 模拟登陆web系统_关于java模拟登陆WEB的问题。
  3. Spring boot定制错误json数据
  4. [转]java Socket InputStream 阻塞 问题
  5. attiny13a程序实例_ATtiny13A图文构成
  6. Dijkstra 计算两地间的最短距离
  7. esp虚拟服务器,esp8266接入云服务器
  8. c语言字符串型函数是,C语言字符/字符串相关函数收藏大全
  9. 命令行cmd跳转到其他地址
  10. 设计模式演练——工厂方法模式
  11. Enterprise Library 2.0 Hands On Lab 翻译(2):数据访问程序块(二)
  12. 电脑主板上的一些电子元件
  13. spoonwep下载地址
  14. resin设置权限_resin加固
  15. 天正建筑2016破解版 64位/32位最新版
  16. SQL DROP TABLE语句概述
  17. 路由入口与vue布局入口
  18. 关于IT程序员一些面试技巧
  19. 计算机网络——传输层
  20. 前端页面如果不放在statis等文件夹,想正常访问该如何解决

热门文章

  1. loj#2542. 「PKUWC2018」随机游走(MinMax容斥 期望dp)
  2. apache将请求转发到到tomcat应用
  3. BT3入门之中文语言支持
  4. 【转】请让孩子输在起跑线上
  5. Oracle 导出部分表结构,以及导入
  6. Delphi面向对象学习随笔一:类与对象的关系
  7. [转载]保护 ASP.NET 应用程序的安全
  8. 每个前端工程师都应该懂的前端性能优化总结:
  9. 三分钟让你掌握JavaScript中值传递和引用传递的区别
  10. Python小记--在特定位置修改CSV文件