Spring Boot 整合 PageHelper 实现分页功能
在开发 Web 应用时,分页功能几乎是必不可少的。Spring Boot 提供了强大的功能来简化开发,而 PageHelper 则是一个优秀的 MyBatis 分页插件,可以极大地简化分页查询的代码。本文将介绍如何在 Spring Boot 项目中整合 PageHelper,并提供完整的代码示例和最佳实践。
一、为什么选择 PageHelper?
PageHelper 是一个 MyBatis 的分页插件,它可以拦截 MyBatis 的查询语句,自动添加分页相关的 SQL 语句,无需编写复杂的分页 SQL 代码,极大地提高开发效率。
相比于手动编写分页 SQL 或使用其他分页工具,PageHelper 具有以下优势:
- 简单易用: 只需添加一行代码PageHelper.startPage(page,pageSize)即可实现分页功能。
- 高效稳定: PageHelper 经过了大量的测试,
- 性能稳定可靠。 支持多种数据库:支持 MySQL、Oracle、SqlServer 等多种数据库。
- 与 Spring Boot 无缝集成: 可以轻松地与 Spring Boot 集成。
二、PageHelper分页实践:
2.1 添加 pageHelper 依赖项
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.1</version>
</dependency>
2.2 分页请求对象
public class BaseObject implements Serializable {
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.MULTI_LINE_STYLE);
}
@Override
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
public class PageDomain extends BaseObject {
/** 当前记录起始索引 */
@ApiModelProperty(value = "页码")
private Integer pageNum;
/** 每页显示记录数 */
@ApiModelProperty(value = "每页显示数")
private Integer pageSize;
/** 排序列 */
@ApiModelProperty(value = "排序列")
private String orderByColumn;
/** 排序的方向desc或者asc */
@ApiModelProperty(value = "排序方向")
private String isAsc = "asc";
/** 搜索值 */
@ApiModelProperty(value = "搜索值")
private String searchVal;
/** 分页参数合理化 */
@ApiModelProperty(hidden = true)
private Boolean reasonable = true;
@ApiModelProperty(hidden = true)
public String getOrderBy()
{
if (StringUtils.isEmpty(orderByColumn))
{
return "";
}
return orderByColumn + " " + isAsc;
}
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 String getOrderByColumn()
{
return orderByColumn;
}
public void setOrderByColumn(String orderByColumn)
{
this.orderByColumn = orderByColumn;
}
public String getIsAsc()
{
return isAsc;
}
public void setIsAsc(String isAsc)
{
if (StringUtils.isNotEmpty(isAsc))
{
// 兼容前端排序类型
if ("ascending".equals(isAsc))
{
isAsc = "asc";
}
else if ("descending".equals(isAsc))
{
isAsc = "desc";
}
this.isAsc = isAsc;
}
}
public Boolean getReasonable()
{
if (ObjectUtils.isEmpty(reasonable))
{
return Boolean.TRUE;
}
return reasonable;
}
public void setReasonable(Boolean reasonable)
{
this.reasonable = reasonable;
}
public String getSearchVal() {
return searchVal;
}
public void setSearchVal(String searchVal) {
this.searchVal = searchVal;
}
}
2.3 分页返回数据对象
@Data
@ApiModel(value = "分页数据对象")
public class PageDataInfo<T> extends BaseObject{
/**
* 总记录数
*/
@ApiModelProperty(value = "总记录数")
private long total;
/**
* 列表数据
*/
@ApiModelProperty(value = "列表数据")
private List<T> list;
/**
* 统计数据
*/
@ApiModelProperty(value = "统计数据")
private T statObj;
public PageDataInfo(long total, List<T> list) {
this.total = total;
this.list = list;
}
public PageDataInfo() {
}
}
2.4 分页工具类PageUtils
public class PageUtils extends PageHelper {
/**
* 设置请求分页数据
*/
public static void startPage(PageDomain pageDomain) {
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
String orderBy = pageDomain.getOrderBy();
Boolean reasonable = pageDomain.getReasonable();
PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
}
/**
* 清理分页的线程变量
*/
public static void clearPage()
{
PageHelper.clearPage();
}
public static <T> PageDataInfo<T> buildPageDataInfo(List<T> list) {
PageDataInfo<T> pageDataInfo = new PageDataInfo<>();
pageDataInfo.setList(list);
pageDataInfo.setTotal(new PageInfo(list).getTotal());
return pageDataInfo;
}
}
2.5 编写公共Controller类,方便直接调用
public class BaseController {
/**
* 设置请求分页数据
*/
protected void startPage(PageDomain pageDomain) {
checkPageParams(pageDomain.getPageNum(), pageDomain.getPageSize());
PageUtils.startPage(pageDomain);
}
/**
* 校验分页参数
* @param pageNum
* @param pageSize
*/
public void checkPageParams(Integer pageNum, Integer pageSize) {
if (pageNum == null || pageNum.intValue() <= 0) {
System.out.println("请求参数无效");
}
if (pageSize == null || pageSize.intValue() <= 0) {
System.out.println("请求参数无效");
}
}
/**
* 清理分页的线程变量
*/
protected void clearPage() {
PageUtils.clearPage();
}
/**
* 响应请求分页数据
*/
public <T> PageDataInfo<T> buildPageDataInfo(List<T> list) {
PageDataInfo<T> pageDataInfo = new PageDataInfo<>();
pageDataInfo.setList(list);
pageDataInfo.setTotal(new PageInfo(list).getTotal());
return pageDataInfo;
}
/**
* 响应请求分页数据
*/
public <T> PageDataInfo<T> buildPageDataInfo(List<T> list, T statObj) {
PageDataInfo<T> pageDataInfo = new PageDataInfo<>();
pageDataInfo.setList(list);
pageDataInfo.setTotal(new PageInfo(list).getTotal());
pageDataInfo.setStatObj(statObj);
return pageDataInfo;
}
/**
* 响应请求分页数据
*/
public <T> PageDataInfo<T> buildPageDataInfo(PageInfo<T> pageInfo) {
PageDataInfo<T> pageDataInfo = new PageDataInfo<>();
pageDataInfo.setList(pageInfo.getList());
pageDataInfo.setTotal(pageInfo.getTotal());
return pageDataInfo;
}
}
2.6 编写Controller测试分页功能点
@Data
@ApiModel("用户信息查询请求")
public class UserInfoReq extends PageDomain {
}
@RestController
@RequestMapping("/yes")
public class ExtendController extends BaseController {
@Autowired
private UserInfoService userInfoService;
@PostMapping("/list")
public Result<PageDataInfo<UserInfo>> queryUserInfoList(@RequestBody UserInfoReq req) {
startPage(req);
return Result.success(buildPageDataInfo(userInfoService.list()));
}
}
三、最佳实践
- 参数校验: 在 Service 层或 Controller 层添加参数校验,防止 pageNum 和 pageSize 为无效值。
- 异常处理: 处理可能出现的异常,例如数据库连接错误或 SQL 执行错误。
- 合理化参数: 设置pagehelper.reasonable=true,让PageHelper处理异常页码的情况。
- 日志记录: 记录日志,方便问题追踪。
原文地址:https://blog.csdn.net/I_Am_Your_God52/article/details/145188054
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!