前言
大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫
适合人群
- 学完Java基础
- 想通过Java快速构建web应用程序
- 想学习或了解SpringBoot
大佬可以绕过 ~
背景
如果你是一路看过来的,很高兴你能够耐心看完。之前带大家学了Springboot
基础部分,对基本的使用有了初步的认识, 接下来的几期内容将会带大家进阶使用,会先讲解基础中间件
的使用和一些场景的应用,或许这些技术你听说过,没看过也没关系,我会带大家一步一步的入门,耐心看完你一定会有收获
~
情景回顾
上期带大家学习了Springboot
中如何集成redis
以及它的一个基本使用, 本期将带大家学习mybatis
的一个分页插件
的使用,同样的,我们集成到Springboot
中。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码
项目源码(持续更新⭐️)
为什么需要分页?
分页好比你买的书一样,它内容多了,总不能放一页吧,一页也放不下,所以得分页,第一页翻完就翻第二页,所以很好理解。在程序中,一般分页常用于列表的接口比如用户列表、文章列表等等,而列表项的数据一般都返回很简单的数据用于前端展示,详情页一般会展示比较全的一个数据,所以大家写接口的时候可以注意下,不要全部返回数据。有的详情是要带着权限去查询的,如果列表就返回了全部数据,万一对方是个懂技术的,不就曝光了表里的全部数据了。
我们再说一下分页的算法, 分页里主要有两个变量一个是page
, 另一个是pageSize
,一般由前端传过来,服务端会接收这两个数值,在接收的时候要判断一下,如果对方为空或者0,你可以设置一个基础值比如page=1
, pageSize=10
,不至于用户看到的是空列表
其实分页,在sql
中就可以做分页功能了,之前讲mysql
没给大家介绍,主要是想结合这一节一起讲。那么sql
怎么做分页呢?以之前的用户角色列表为例:
SELECT * from user_role LIMIT 10 OFFSET 0 复制代码
同样的,主要是limit
, offset
这两个值, 第一个很好理解,限制数量,就是一页多少个数据,第二个也很好理解,位移,就是向下位移多少条数据,一般可以通过如下公式计算:
limit = pageSize offset = pageSize * (page -1) 复制代码
很简单的数学题,不要说不会 ~
使用sql进行分页
好,有了以上基础,大家可以自行试一下,在**Mapper.xml
写一下试试,这种方式也是可以的, 下面给大家介绍个神器
集成分页插件
同样的,修改一下我们的pom.xml
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> </dependency> 复制代码
怎么使用?
这里直接帮大家封装好,因为一般列表项数据主要涉及几个属性, list(数据)
, total(总条数)
, pageSize(一页多少条)
, pageNum(当前第几页)
,主要涉及这几项,因为前端一般也会根据这几个值,进行列表,页码的一个展示,好,我们直接看代码:
public class CommonPage<T> { private Integer pageNum; private Integer pageSize; private Long total; private List<T> list; /** * 将PageHelper分页后的list转为分页信息 */ public static <T> CommonPage<T> restPage(List<T> list) { CommonPage<T> result = new CommonPage<T>(); PageInfo<T> pageInfo = new PageInfo<T>(list); result.setPageNum(pageInfo.getPageNum()); result.setPageSize(pageInfo.getPageSize()); result.setTotal(pageInfo.getTotal()); result.setList(pageInfo.getList()); return result; } public static void setPageHelper(Integer pageNum, Integer pageSize) { if(pageNum == null || pageNum <= 0) { pageNum = 1; } if(pageSize == null || pageSize <= 0) { pageSize = 10; } if(pageSize >= 20) { pageSize = 20; } PageHelper.startPage(pageNum, pageSize); } public Integer getPageNum() { return pageNum; } public void setPageNum(Integer pageNum) { this.pageNum = pageNum; } public Integer getPageSize() { return pageSize; } public void setPageSize(Integer pageSize) { this.pageSize = pageSize; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } public Long getTotal() { return total; } public void setTotal(Long total) { this.total = total; } } 复制代码
然后,我们去调用它, 修改我们之前写的列表:
@GetMapping("role/list") @ResponseBody public CommonPage<UserRole> getUserRole() { CommonPage.setPageHelper(1, 10); List<UserRole> list = userRoleMapper.getRoles(); return CommonPage.restPage(list); } 复制代码
请求成功后会返回如下:
{ "pageNum": 1, "pageSize": 10, "total": 1, "list": [ { "id": 1, "name": "普通用户123", "roleName": "普通用户" } ] } 复制代码
其实它的原理,也是对sql
进行了改写,进行了sql
查询, 底层主要依赖mybatis
的拦截器进行实现的, 这里不给大家过多深入讲解,后边会给大家介绍,我们先熟练掌握它的一个基本使用。
结束语
本期就到这里结束了,总结一下,本节主要带大家学习了sql
如何进行分页查询和介绍了mybatis 分页插件
的基本使用,建议大家多去试着写写
下期预告
下期带大家学习springboot
中,如何处理跨域问题, 如果你不知道啥事跨域
,我会从头说起。 我们下期不见不散, 关注我,不迷路~