首页 > 其他分享 >1.封装PageHelper实现分页

1.封装PageHelper实现分页

时间:2023-03-29 20:11:52浏览次数:32  
标签:封装 分页 PageHelper startPage 单例 PageDomain 方法 pageDomain

前言

  这几天想着动手将一些技术融合到项目中,昨天思考了会儿,想起了我与亲戚的对话:我说:“我想将若依项目完整的实现一遍”,亲戚给我反馈到“你没必要完整复现若依项目,而且你的时间不允许,你可以将它里面的功能融合到你的项目中去”。他说的很多话对我受益不浅,我认真思考了下,决定将若依的一些技术点融合到自己的项目中去。这篇博客,我将若依里面的分页实现运用于我自己编写的简单工单平台上面。接下来让我们看看若依是如何实现分页的把。

1.导入依赖

<!--实现分页-->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.4.6</version>
</dependency>

  首先我们导入依赖,这样才能使用分页这个功能。

2.配置文件

#pageHelper分页
pagehelper.helper-dialect=mysql
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql

  在导入依赖之后,我们还需要进行配置文件的配置才能使这个分页插件生效

3.分页实现代码分析

3.1 Controller中的分页实现

  在controller层中,我们如果要实现数据分页显示,必须在startPage()后面添加要分页查询的列表数据,再在最后返回分页数据

代码如下:

@GetMapping("/list")
public TableDataInfo list(@RequestParam(value = "name", required = false) String username){
    //继承BaseController类,直接调用其中的分页方法
    startPage();
    List<SysUser> list = userDetailsService.getUserListByUsername(username);
    //继承BaseController中返回分页查询数据方法,显示查询的总数、信息、状态码、返回消息
    return getDataTable(list);
}

3.2 startPage()和getDataTable()方法

  在上述代码中,startPage()方法和getDataTable()方法都是定义在BaseController中的代码,我们的SYSUserController类通过继承该类来实现复用分页以及返回分页数据的方法。下面是BaseController中startPage()方法和getDataTable()方法代码实现:

protected void startPage(){
    PageUtils.startPage();
}

@SuppressWarnings({ "rawtypes", "unchecked" })
protected TableDataInfo getDataTable(List<?> list)
{
    TableDataInfo rspData = new TableDataInfo();
    rspData.setCode(0);
    rspData.setRows(list);
    rspData.setTotal(new PageInfo(list).getTotal());
    rspData.setMsg("分页查询成功!");
    return rspData;
}

3.3 startPage()方法具体实现

  在上面的代码中,我们会发现BaseController中是通过PageUtils工具类的startPage()方法来实现分页的,作者将startPage()方法进行了封装,若依项目其实封装了很多知识点,使得很多代码复用,很厉害。而getDataTable()方法其实是返回TableDataInfo类的对象,该对象将list对象作为参数,返回分页查询的信息,状态码以及状态信息和查询信息的总数。

  下面我们再进一步看一下PageUtils类是如何实现startPage()方法的

/**
 * 设置请求分页数据
 */
public static void startPage(){
    //通过TableSupport设置客户输入的分页属性
    PageDomain pageDomain = TableSupport.buildPageRequest();
    Integer pageNum = pageDomain.getPageNum();
    Integer pageSize = pageDomain.getPageSize();
    String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
    Boolean reasonable = pageDomain.getReasonable();
    PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
}

3.4 使用单例模式中的IoDH创建单例分页类

  在上述代码中PageDomian实体类设置了分页的属性,如起始页、每页大小、升序或降序排序、合理性等等,那作者是如何具体创建PageDomain对象的呢?很显示是通过TableSupport的builePageRequest()方法来创建pageDomain对象的,下面我们再来看看它具体是如何创建的

public static PageDomain getPageDomain()
{
    PageDomain pageDomain = new PageDomain();
    //首先获取用户输入的分页参数信息,如果转换错误,则使用默认值
  pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1));
    pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10));
    //后面使用的默认值
    pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
    pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
    pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
    return pageDomain;
}

//为什么不直接调用getPageDomain()方法返回一个对象而是重新创建一个方法返回这个对象呢?
//这里使用的单例模式中的IoDH技术,使用静态内部类来封装属性,
//该对象通过buildPageRequest()方法返回给外部使用
public static PageDomain buildPageRequest()
{
    return getPageDomain();
}
通过IoDH创建单例PageDomain对象

  在上面代码中首先通过一个静态方法创建一个PageDomain对象,并封装它所需要的属性,首先从客户端获取进行转换,如果转换失败就是用默认值,最后再返回PageDomain对象,在这里我当时很感慨为什么不直接调用getPageDomian()方法,而是将其传入到一个静态方法中返回PageDomain对象。后面想着这跟单例模式中最好的IoDH方法很相似。在我学习的单例模式中的IoDH例题中是使用一个静态内部类来创建单例对象,而上述代码是运用同样的形式来创建并封装单例分页对象的属性,再都是通过一个静态方法返回创建对象的方法,两者之间有着异曲同工之妙,这代码既保证了延迟加载,也保证了线程安全,很赞!

4.分页查询结果

   在上述图片中,我们可以看到分页查询的结果,由于数据库中同一名字的user太少,所以只是显示了一个,但这不影响代码的正确性。返回结果汇总包含了用户的信息、状态码、查询的用户总数目、以及状态信息。

5.小结

  首先在Controller方法中,调用satrtPage()方法来实现分页,且该语句只会对第一个查询到的数据进行分页,最后返回参数为list的getDataInfo()方法即返回查询的信息以分页显示、显示数据总数、数据信息状态码、以及查询成功返回信息。创建一个TableSupport类使用一个静态内部类创建一个单例PageDomain对象来封装该对象的属性信息。   如果本文中存在问题,请大家踊跃指出,谢谢!

 

标签:封装,分页,PageHelper,startPage,单例,PageDomain,方法,pageDomain
From: https://www.cnblogs.com/kzf-99/p/17270179.html

相关文章

  • 拼多多商品列表接口,关键词搜索拼多多商品接口,拼多多优惠券接口代码封装教程
    业务场景:作为全球最大的B2C电子商务平台之一,拼多多平台提供了丰富的商品资源,吸引了大量的全球买家和卖家。为了方便开发者接入拼多多平台,拼多多平台提供了丰富的API接口......
  • github的pageHelper分页和手动分页
    java中各种常用分页插件:MyBatis分页插件:MyBatis提供了一种分页插件,可以通过配置实现分页查询。使用MyBatis分页插件需要在配置文件中添加插件配置。PageHelper:PageHe......
  • el-upload批量图片上传封装
    需求:实现图片一次性上传  调一次接口 子组件<template><divclass="uploadDiv"><el-uploadref="upload"action="#"list-type="p......
  • 面向对象和面向过程(封装继承多态)
    面向对象&面向过程面向过程思想步骤清晰,第一步做什么第二步做什么面对过程适合处理一些简单的问题面向对象思想物以类聚,分类的思维模式对于描述复杂的事物,为了从......
  • 亿万级分库分表后如何进行跨表分页查询
    前言在常规的应用系统开发中,很少会涉及到需要对数据进行分库或者分表的操作,多数情况下,我们习惯使用ORM带来的便利,且使用连接查询是一种高效率的开发方式,就算涉及到分表的......
  • spring data jpa 分页
    publicPage<Task>getUserTask(LonguserId,Map<String,Object>searchParams,intpageNumber,intpageSize,StringsortType){PageRequestpageRequest=buil......
  • vue 软键盘组件封装
    场景和需求1软键盘固定2多输入框共用一个组件,聚焦切换时操作对象自动切换3根据光标在输入框的位置进行相应的输入和删除操作4点击软键盘时保存输入框光标活跃5输......
  • TS+Vue3+Echarts的封装与使用
    TS+Vue3+Echarts的组件封装步骤如下统计分析页面使用栅格布局进行规划     抽离组件分别包括数字面板组件count-card,统计面板组件chart-card及特定图......
  • C#面向对象核心-封装
    封装封装定义为"把一个或多个项目封闭在一个物理的或者逻辑的包中",这个包就是类。在面向对象程序设计方法论中,封装可以防止对实现细节的访问。1类和对象1.1什么是类......
  • 分页查询
         ......