Mybatis Plus 分页查询数据(图解)

 更新时间 2023-01-01 11:58:32

大家好,我是小哈。

本小节中,我们将学习如何通过 Mybatis Plus 分页查询数据库表中的数据。

什么是分页查询?

下图是小哈从京东上查询关键词 「手机」 ,展示的手机数据就是分页查询,共有 91 页:

京东商城的分页查询

分页查询就是把需要查询的数据集进行分批展示,比如商品表中有 1万 条手机数据,每页按固定数量展示。

为什么需要分页查询?

  1. 前端页面能够展示的内容有限;

  2. 当数据库中数据量太多,比如 100W 条,一次性全部返回,查询速度慢,而且内存也顶不住;

表结构

了解到分页查询相关概念后,我们来上手 Mybatis Plus 的分页查询功能,还是之前小节中定义好的用户测试表, 执行脚本如下:

DROP TABLE IF EXISTS user; CREATE TABLE `user` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(30) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NULL DEFAULT NULL COMMENT '年龄', `gender` tinyint(2) NOT NULL DEFAULT 0 COMMENT '性别,0:女 1:男', PRIMARY KEY (`id`) ) COMMENT = '用户表'; 

定义实体类

定义一个名为 User 实体类:

@TableName("user")
public class User {/** * 主键 ID, @TableId 注解定义字段为表的主键,type 表示主键类型,IdType.AUTO 表示随着数据库 ID 自增 */ @TableId(type = IdType.AUTO) private Long id; /** * 姓名 */ private String name; /** * 年龄 */ private Integer age; /** * 性别 */ private Integer gender; } 

不明白 Mybatis Plus 实体类注解的小伙伴,可参考前面小节 , 有详细解释。

新增测试数据

分页查询前,先通过代码插入一些测试数据,执行代码如下:

// 循环插入 100 条测试数据
for (int i = 0; i < 100; i++) { User user = new User(); user.setName("犬小哈" + i); user.setAge(i); user.setGender(1); userMapper.insert(user); } 

TIP : 不清楚如何插入数据可翻阅前面 《新增数据》 小节;

添加分页插件

接着,在 MybatisPlusConfig 配置类中,添加分页插件 PaginationInnerInterceptor:

/*** @Author: 犬小哈* @From: 公众号:小哈学Java, 网站:www.quanxiaoha.com* @Date: 2022-12-15 18:29* @Version: v1.0.0 * @Description: TODO **/ @Configuration @MapperScan("com.quanxiaoha.mybatisplusdemo.mapper") public class MybatisPlusConfig { /** * 分页插件 * @return */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(){ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return interceptor; } } 

开始分页查询数据

Mybatis Plus 对 Mapper 层和 Service 层都将常见的增删改查操作封装好了,只需简单的继承,即可轻松搞定对数据的增删改查,本文重点讲解分页查询相关的部分。

Mapper 层

定义一个 UserMapper , 让其继承自 BaseMapper :

public interface UserMapper extends BaseMapper<User> { } 

然后,注入 Mapper :

@Autowired
private UserMapper userMapper;

BaseMapper 提供的分页查询相关的方法如下:

解释一下每个方法的作用:

// 分页查询,page 用于设置需要查询的页数,以及每页展示数据量,wrapper 用于组装查询条件
IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper);
// 同上,区别是用 map 来接受查询的数据
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, Wrapper<T> queryWrapper); 

参数说明:

类型 参数名 描述
Wrapper<T> queryWrapper 实体对象封装操作类(可以为 null)
IPage<T> page 分页查询条件(可以为 RowBounds.DEFAULT)

示例代码

接下来,小哈来演示一些示例代码以便你快速了解如何使用分页查询:

// 组装查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// where age = 30
queryWrapper.eq("age", 30); // 查询第 2 页数据,每页 10 条 Page<User> page = new Page<>(2, 10); page = userMapper.selectPage(page, queryWrapper); System.out.println("总记录数:" + page.getTotal()); System.out.println("总共多少页:" + page.getPages()); System.out.println("当前页码:" + page.getCurrent()); // 当前页数据 List<User> users = page.getRecords(); 

执行上面的代码,实际上执行了两条 SQL : 先执行 COUNT(*) 查询出记录总数,然后才是分页语句 LIMIT:

Page 类说明

该类继承了 IPage 类,实现了 简单分页模型 ,如果你要实现自己的分页模型可以继承 Page 类或者实现 IPage 类

属性名 类型 默认值 描述
records List emptyList 查询数据列表
total Long 0 查询列表总记录数
size Long 10 每页显示条数,默认 10
current Long 1 当前页
orders List emptyList 排序字段信息,允许前端传入的时候,注意 SQL 注入问题,可以使用 SqlInjectionUtils.check(...) 检查文本
optimizeCountSql boolean true 自动优化 COUNT SQL 如果遇到 jSqlParser 无法解析情况,设置该参数为 false
optimizeJoinOfCountSql boolean true 自动优化 COUNT SQL 是否把 join 查询部分移除
searchCount boolean true 是否进行 count 查询,如果指向查询到列表不要查询总记录数,设置该参数为 false
maxLimit Long   单页分页条数限制
countId String   xml 自定义 count 查询的 statementId

Service 层

Mybatis Plus 同样也封装了通用的 Service 层 CRUD 操作,并且提供了更丰富的方法。接下来,我们上手看 Service 层的代码结构,如下图:

定义 Service 层

先定义 UserService 接口 ,让其继承自 IService:

public interface UserService extends IService<User> { } 

再定义实现类 UserServiceImpl,让其继承自 ServiceImpl, 同时实现 UserService 接口,这样就可以让 UserService 拥有了基础通用的 CRUD 功能,当然,实际开发中,业务会更加复杂,就需要向 IService 接口自定义方法并实现:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { } 

注入 UserService :

@Autowired
private UserService userService;

Service 层封装的分页相关方法如下:

// 无条件分页查询
IPage<T> page(IPage<T> page);
// 条件分页查询
IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper);
// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage<T> page); // 条件分页查询 IPage<Map<String, Object>> pageMaps(IPage<T> page, Wrapper<T> queryWrapper); 

示例代码

Service 层的分页方法入参和 Mapper 差不多:

// 组装查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// where age = 30
queryWrapper.eq("age", 30); // 查询第 2 页数据,每页 10 条 Page<User> page = new Page<>(2, 10); page = userService.page(page, queryWrapper); System.out.println("总记录数:" + page.getTotal()); System.out.println("总共多少页:" + page.getPages()); System.out.println("当前页码:" + page.getCurrent()); // 当前页数据 List<User> users = page.getRecords(); 

尾部导航

spring boot集成mybatis-plus——Mybatis Plus 分页查询数据(图解)相关推荐

  1. Spring Boot笔记-JPA中自定义@Query分页查询

    如下事例代码: @Repository public interface XXXXXRepository extends JpaRepository<XXXYYY, XXXYYYPK> { ...

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

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

  3. Spring Boot 集成MyBatis

    Spring Boot 集成MyBatis Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring ...

  4. Spring Boot 集成 Mybatis 实现双数据源

    转载自   Spring Boot 集成 Mybatis 实现双数据源 这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源 ...

  5. spring boot 集成Mybatis时 Invalid bound statement (not found)

    spring boot 集成Mybatis时,运行提示 org.apache.ibatis.binding.BindingException: Invalid bound statement (not ...

  6. Spring Boot集成pagehelper分页插件

    Spring Boot集成pagehelper分页插件 1.在pom.xml中添加pagehelper依赖 2.修改配置文件 3.修改Controller里面的查询方法 4.返回分页信息 1. 修改U ...

  7. win7 x64 基于spring boot+elasticsearch+Redis+mysql+mybatis进行搜索引擎web开发--爬取IThome热评(一)

    因为工作需要,我准备在win7 x64系统上基于springboot +elasticsearch+redis搭建全文索引服务器. 1. elasticsearch安装比较方便,直接去官网下载了ela ...

  8. 从零搭建开发脚手架 Spring Boot集成Mybatis-plus之一

    文章目录 简介 特性 框架结构 依赖集成 依赖 配置 编码 开始使用 核心功能 代码生成器 添加依赖 编码 编写配置 自定义模板引擎 自定义代码模板 自定义属性注入 字段其他信息查询注入 实战总结 常 ...

  9. Spring Boot 集成SnakerFlow流程引擎,简介、功能列表、详细解读、扩展点分析

    文章目录 简介 功能列表 流程定义 任务参与者 参与者设置 动态添加.删除参与者 组支持 详细解读 Spring Boot集成 表定义 表详细说明: 字段详细说明: 常见操作 常规API 综合查询 模 ...

最新文章

  1. 用于自动驾驶的实时 YUV 多任务 CNN
  2. Python入门难吗?30年前的编程语言,为什么现在这么火?
  3. 利用OLED构成可控点光源: SSD1306
  4. android开发系列之数据存储
  5. python九九乘法表代码知乎_二年级上册表内乘法教学反思_二年级6的乘法口诀教学反思...
  6. firefox 39 linux,Mozilla Firefox 39.0 Beta 4 发布下载
  7. 微信分享签名无效php_php实现微信分享朋友链接功能
  8. Spring boot Rabbitmq 示例
  9. 在打包的时候,创建应用程序池,并自动将程序assign到新创建的池中(MSI制作)
  10. 200中国姓氏日语发音
  11. Project Tungsten:将Apache Spark更接近裸机
  12. 桌面计算机地址栏在哪,电脑窗口地址栏清理
  13. unity 手机游戏研究
  14. c语言long类型转换成string,如何在C ++中将long转换为string?
  15. linux查看pv数据量,linux下计算网站PV量、UV量
  16. Oracle Newsletter闪亮人物推介--Joel Perez
  17. push()、pop()、shift()、unshift()方法简单整理
  18. 思科模拟器之虚拟局域网
  19. # 7-3 二分法求多项式单根
  20. 必不可少的数学基础-聚点原理

热门文章

  1. Xamarin.forms之Image加载服务器图片、WebView
  2. SSL证书怎么删除私钥密码保护?
  3. 今天下载了一个刷机大师,结果把android的端口给占了。郁闷了很久
  4. ubuntu with linux 3.19,ubuntu更改启动顺序
  5. ios12控制中心打不开相机和计算机,如何修复iPhone 12相机无法正常工作?
  6. EGO-PLANNER代码阅读(地图部分)
  7. Android中保存图片到本地功能实现
  8. 【OpenFeign】【源码+图解】【二】注册OpenFeign接口的实例
  9. 二月开班通知丨黑马20校区火力全开,多班级爆满!
  10. 关于SSM发送手机验证码