本文来自作者 "臣不贰" 投稿。
一. 开发准备
1. 开发工具
IntelliJ IDEA 2020.2.3
2. 开发环境
Red Hat Open JDK 8u256
Apache Maven 3.6.3
3. 开发依赖
SpringBoot
org.springframework.boot
spring-boot-starter-web
MyBatis
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.3
PageHelper
com.github.pagehelper
pagehelper-spring-boot-starter
1.3.0
二. 技术文档
1. 基于SpringBoot
2. 基于MyBatis
3. 集成PageHelper
三. 应用讲解
1. 基本使用
在实际项目运用中,PageHelper的使用非常便利快捷,仅通过PageInfo + PageHelper两个类,就足以完成分页功能,然而往往这种最简单的集成使用方式,却在很多实际应用场景中,没有得到充分的开发利用.
接下来是我们最常见的使用方式:
public PageInfo page(RequestParamDto param) {
PageHelper.startPage(param.getPageNum(), param.getPageSize());
List list = mapper.selectManySelective(param);
PageInfo pageInfo = (PageInfo)list;
return pageInfo;
}
在某种程度上而言,上述写法的确是符合PageHelper的使用规范 :
在集合查询前使用`PageHelper.startPage(pageNum,pageSize)`,并且*中间不能穿插执行其他SQL*
但是作为Developer的我们,往往只有在追求完美和极致的道路上才能够寻得突破和机遇;
以下是合理且规范的基本使用:
public PageInfo page(RequestParamDto param) {
return PageHelper.startPage(param.getPageNum(), param.getPageSize())
.doSelectPageInfo(() -> list(param))
}
public List list(RequestParamDto param) {
return mapper.selectManySelective(param);
}
FAQ
1. 为什么要重新声明一个list函数?
答: 往往在很多实际业务应用场景中, 分页查询是基于大数据量的表格展示需求来进行的.
然而很多时候,譬如: 内部服务的互相调用,OpenAPI的提供.
甚至在某些前后端分离联调的业务场景中,是同样需要一个非分页集合查询接口来提供服务的.
另外,暂时以上因素抛开不谈,我们可以根据上述写法来定义和规范某些东西
譬如: 分页和集合查询的分离和解耦(解耦详情请看进阶使用),
分页请求的请求和响应与实际业务参数的分离(详情请看进阶使用)等等...
2. doSelectPageInfo是什么?
答: doSelectPageInfo是PageHelper.startPage()函数返回的默认Page实例内置的函数,该函数可以用以Lambda的形式通过额外的Function来进行查询而不需要再进行多余的PageInfo与List转换,而doSelectPageInfo的参数则是PageHelper内置的Function(ISelect)接口用以达到转换PageInfo的目的
3. 这种写法的代码量看起来不少反多?
答: 正如同①中所描述的,就代码量而言,确实没有更进一步的简化,但是再某些业务场景中,在已具有list函数接口的情况下,是一种更直观的优化(优化详情请看进阶使用)
2. 进阶使用
先看代码,再谈解析:
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import java.util.List;
/**
* @param 泛型request
* @param 泛型response
*/