SpringBoot集成MyBatis-Plus分页插件
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分页插件相关推荐
- SpringBoot集成MyBatis的分页插件PageHelper(回头草)
俗话说:好?不吃回头草,但是在这里我建议不管你是好马还是不好马,都来吃吃,带你复习一下分页插件PageHelper. 昨天给各位总结了本人学习springboot整合mybatis第一阶段的一些学习心 ...
- SpringBoot集成MyBatis的分页插件PageHelper
[写在前面] 项目的后台管理系统需要展示所有资源信息,select * 虽然方便但数据量过于庞大会严重降低查找效率,页面加载慢,用户体验差.分页自然是必要选择,但原生的方法过于繁杂.MyBatis的分 ...
- Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper
1. 概述 本文的内容包括如下内容: Spring Boot集成mybatis Spring Boot集成pagehelper分页插件,定义分页的相关类 实现工具类:model转dto,实现数据层和传 ...
- Springboot集成mybatis通用Mapper与分页插件PageHelper
Springboot集成mybatis通用Mapper与分页插件PageHelper 插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 ...
- Spring Boot2.0 整合mybatis、分页插件、druid
2019独角兽企业重金招聘Python工程师标准>>> 前言 本文主要是针对SpringBoot2.0.2版本,实现整合mybatis.分页插件.druid等组件,实现完整的web服 ...
- SpringBoot----[16]—SpringBoot集成MyBatis
SpringBoot----[16]-SpringBoot集成MyBatis 集成Mybatis 新建maven project 新建一个maven project,取名为:spring-boot-m ...
- SpringBoot集成Mybatis项目实操
本文为<从零打造项目>系列第三篇文章,首发于个人网站. <从零打造项目>系列文章 比MyBatis Generator更强大的代码生成器 SpringBoot项目基础设施搭建 ...
- SpringBoot集成Mybatis Plus
Mybatis Plus是Mybatis的升级版本,提供一些默认的功能实现,只要按照其约定编写代码,就可以充分利用其特性. SpringBoot集成Mybatis Plus步骤: 每个实体类定义一套M ...
- SpringBoot教程(十一) | SpringBoot集成Mybatis
上一篇文章我们介绍了SpringBoot集成JdbcTemplate.简单体验了一下JdbcTemplate框架的用法,今天的内容比较重要,我们来介绍一下SpringBoot集成Mybatis的步骤. ...
- SpringBoot——SpringBoot集成MyBatis
目录 1 SpringBoot集成MyBatis 1.1 准备工作 1.2 pom.xml文件 1.3 核心配置文件(application.properties) 1.4 GeneratorMapp ...
最新文章
- input反应慢 vue_Vue v-model实时更新带来的输入框卡顿问题
- java 模拟登陆web系统_关于java模拟登陆WEB的问题。
- Spring boot定制错误json数据
- [转]java Socket InputStream 阻塞 问题
- attiny13a程序实例_ATtiny13A图文构成
- Dijkstra 计算两地间的最短距离
- esp虚拟服务器,esp8266接入云服务器
- c语言字符串型函数是,C语言字符/字符串相关函数收藏大全
- 命令行cmd跳转到其他地址
- 设计模式演练——工厂方法模式
- Enterprise Library 2.0 Hands On Lab 翻译(2):数据访问程序块(二)
- 电脑主板上的一些电子元件
- spoonwep下载地址
- resin设置权限_resin加固
- 天正建筑2016破解版 64位/32位最新版
- SQL DROP TABLE语句概述
- 路由入口与vue布局入口
- 关于IT程序员一些面试技巧
- 计算机网络——传输层
- 前端页面如果不放在statis等文件夹,想正常访问该如何解决