spring boot集成mybatis-plus——Mybatis Plus 分页查询数据(图解)
Mybatis Plus 分页查询数据(图解)
大家好,我是小哈。
本小节中,我们将学习如何通过 Mybatis Plus 分页查询数据库表中的数据。
什么是分页查询?
下图是小哈从京东上查询关键词 「手机」 ,展示的手机数据就是分页查询,共有 91 页:
京东商城的分页查询
分页查询就是把需要查询的数据集进行分批展示,比如商品表中有 1万 条手机数据,每页按固定数量展示。
为什么需要分页查询?
前端页面能够展示的内容有限;
当数据库中数据量太多,比如 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 分页查询数据(图解)相关推荐
- Spring Boot笔记-JPA中自定义@Query分页查询
如下事例代码: @Repository public interface XXXXXRepository extends JpaRepository<XXXYYY, XXXYYYPK> { ...
- Spring Boot系列六 Spring boot集成mybatis、分页插件pagehelper
1. 概述 本文的内容包括如下内容: Spring Boot集成mybatis Spring Boot集成pagehelper分页插件,定义分页的相关类 实现工具类:model转dto,实现数据层和传 ...
- Spring Boot 集成MyBatis
Spring Boot 集成MyBatis Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring ...
- Spring Boot 集成 Mybatis 实现双数据源
转载自 Spring Boot 集成 Mybatis 实现双数据源 这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源 ...
- spring boot 集成Mybatis时 Invalid bound statement (not found)
spring boot 集成Mybatis时,运行提示 org.apache.ibatis.binding.BindingException: Invalid bound statement (not ...
- Spring Boot集成pagehelper分页插件
Spring Boot集成pagehelper分页插件 1.在pom.xml中添加pagehelper依赖 2.修改配置文件 3.修改Controller里面的查询方法 4.返回分页信息 1. 修改U ...
- win7 x64 基于spring boot+elasticsearch+Redis+mysql+mybatis进行搜索引擎web开发--爬取IThome热评(一)
因为工作需要,我准备在win7 x64系统上基于springboot +elasticsearch+redis搭建全文索引服务器. 1. elasticsearch安装比较方便,直接去官网下载了ela ...
- 从零搭建开发脚手架 Spring Boot集成Mybatis-plus之一
文章目录 简介 特性 框架结构 依赖集成 依赖 配置 编码 开始使用 核心功能 代码生成器 添加依赖 编码 编写配置 自定义模板引擎 自定义代码模板 自定义属性注入 字段其他信息查询注入 实战总结 常 ...
- Spring Boot 集成SnakerFlow流程引擎,简介、功能列表、详细解读、扩展点分析
文章目录 简介 功能列表 流程定义 任务参与者 参与者设置 动态添加.删除参与者 组支持 详细解读 Spring Boot集成 表定义 表详细说明: 字段详细说明: 常见操作 常规API 综合查询 模 ...
最新文章
- 用于自动驾驶的实时 YUV 多任务 CNN
- Python入门难吗?30年前的编程语言,为什么现在这么火?
- 利用OLED构成可控点光源: SSD1306
- android开发系列之数据存储
- python九九乘法表代码知乎_二年级上册表内乘法教学反思_二年级6的乘法口诀教学反思...
- firefox 39 linux,Mozilla Firefox 39.0 Beta 4 发布下载
- 微信分享签名无效php_php实现微信分享朋友链接功能
- Spring boot Rabbitmq 示例
- 在打包的时候,创建应用程序池,并自动将程序assign到新创建的池中(MSI制作)
- 200中国姓氏日语发音
- Project Tungsten:将Apache Spark更接近裸机
- 桌面计算机地址栏在哪,电脑窗口地址栏清理
- unity 手机游戏研究
- c语言long类型转换成string,如何在C ++中将long转换为string?
- linux查看pv数据量,linux下计算网站PV量、UV量
- Oracle Newsletter闪亮人物推介--Joel Perez
- push()、pop()、shift()、unshift()方法简单整理
- 思科模拟器之虚拟局域网
- # 7-3 二分法求多项式单根
- 必不可少的数学基础-聚点原理
热门文章
- Xamarin.forms之Image加载服务器图片、WebView
- SSL证书怎么删除私钥密码保护?
- 今天下载了一个刷机大师,结果把android的端口给占了。郁闷了很久
- ubuntu with linux 3.19,ubuntu更改启动顺序
- ios12控制中心打不开相机和计算机,如何修复iPhone 12相机无法正常工作?
- EGO-PLANNER代码阅读(地图部分)
- Android中保存图片到本地功能实现
- 【OpenFeign】【源码+图解】【二】注册OpenFeign接口的实例
- 二月开班通知丨黑马20校区火力全开,多班级爆满!
- 关于SSM发送手机验证码