前言

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

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.在若依分页实现中作者自写的工具类

    在若依项目中,作者定义了很多自定义的工具类,很厉害。在分页实现中的自定义工具类如下:

详细的源码请看若依项目,链接为RuoYi: 基于SpringBoot的权限管理系统 易读易懂、界面简洁美观。 核心技术采用Spring、MyBatis、Shiro没有任何其它重度依赖。直接运行即可用 (gitee.com)

5.分页查询结果

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

6.小结

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

1.封装PageHelper实现分页的更多相关文章

  1. 浅谈PageHelper插件分页实现原理及大数据量下SQL查询效率问题解决

    前因:项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一直没有什么问题.随着业务扩增,数据库扩增PageHelper出现了明显的性能问题.几十万甚至上百万的单表数据查询性能缓慢,需 ...

  2. SSM+Maven使用PageHelper插件分页

    官方网站: https://pagehelper.github.io/docs/howtouse/#2-%E9%85%8D%E7%BD%AE%E6%8B%A6%E6%88%AA%E5%99%A8%E6 ...

  3. PageHelper实现分页查询

    PageHelper是基于拦截器实现的myBatis分页插件 PageHelper的Github主页 : https://github.com/pagehelper/Mybatis-PageHelpe ...

  4. spring boot集成mybatis(2) - 使用pagehelper实现分页

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  5. Springboot 整合通用mapper和pagehelper展示分页数据(附github源码)

    简介 springboot 设计目的就是为了加速开发,减少xml的配置.如果你不想写配置文件只需要在配置文件添加相对应的配置就能快速的启动的程序. 通用mapp 通用mapper只支持对单表的操作,对 ...

  6. Spring boot入门(三):SpringBoot集成结合AdminLTE(Freemarker),利用generate自动生成代码,利用DataTable和PageHelper进行分页显示

    关于SpringBoot和PageHelper,前篇博客已经介绍过Spring boot入门(二):Spring boot集成MySql,Mybatis和PageHelper插件,前篇博客大致讲述了S ...

  7. SpringBoot+Mybatis+PageHelper实现分页

    SpringBoot+Mybatis+PageHelper实现分页 mybatis自己没有分页功能,我们可以通过PageHelper工具来实现分页,非常简单方便 第一步:添加依赖 <depend ...

  8. 没有调用PageHelper.startPage()分页方法,最后还是执行了PageHelper分页方法的原因

    SELECT * FROM ( SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ( SELECT * FROM ( SELECT A.*, ROWNUM RN FROM ( ...

  9. DRF 返回数据的封装,和分页

    DRF 返回数据的封装,和分页 1 返回值的 封装 自定义一个类,初始化基本的返回数据信息 class BaseResponse(object): """ 初始化基本的返 ...

  10. Spring Boot入门系列(十六)使用pagehelper实现分页功能

    之前讲了Springboot整合Mybatis,然后介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.接下来要说一说Mybatis 的分页 ...

随机推荐

  1. vue+element 表格动态列添加点击事件与排序(/或者空值排最后)

    <template> <div> <el-table     ref="tableData"       :data="tableData& ...

  2. Linux安装ODBC连接SQLServer数据库

    操作系统:Centos7.2 1.下载ODBC安装包 unixODBC-2.3.9.tar.gz freetds-1.3.9.tar.gz 下载这两个压缩包的地址:ftp://ftp.freetds. ...

  3. 微信端手机跨域上传图片偶尔跑进error

    如题.我这两天被这个问题搞得焦头烂额.其他端都没问题,就微信端的有问题,就是因为通过ajax上传图片的时候,设置了 async: false,然后客户用了测试总是跑进error,客户问什么情况,我也找 ...

  4. vue引入多个指令文件

    单个指令引入,在main.js(入口JS文件)中引入你已经写好的指令文件,可以省略文件后缀: // main.js import focus from 'xxx/directive'多个指令引入 Vu ...

  5. axios实现无感刷新

    前言 最近在做需求的时候,涉及到登录token,产品提出一个问题:能不能让token过期时间长一点,我频繁的要去登录. 前端:后端,你能不能把token 过期时间设置的长一点. 后端:可以,但是那样做 ...

  6. 【组会】2023_1_6 4d mmwave

    A NEW AUTOMOTIVE RADAR 4D POINT CLOUDS DETECTOR BY USING DEEP LEARNING ICASSP 2021 - 2021 IEEE Inter ...

  7. learning rate,exponential decay

    (96条消息) Python函数:学习率衰减 tf.train.exponential_decay()_萌萌哒huo的博客-CSDN博客_python 衰减函数 ln即学习率(learning rat ...

  8. IntelliJ IDEA常用插件

    Mybatis Log Plugin安装好插件后,在Tools工具栏中可以看到安装好的插件,点击即可打开相应窗口,在Debug时,相应的Sql语句即可输出到此窗口,方便查看.此插件相当好用,提升开发效 ...

  9. NSIS 将一整个文件夹拷贝

    在做安装包的时候,有时候需要将文件夹以及文件夹下面所包含的所有文件夹和文件都拷贝到目标文件夹,一下有两种方法可以连同文件夹一起拷贝: 各文件的位置如下: 其中src 文件夹下的文件如下: 一开始dst ...

  10. Pinia使用技巧

    vue2使用的vuex,是一个状态管理器,现在vue3出了最新的pinia,今年偿试一下. 首先是安装,这里要注意一下,有一个持久化插件,如果不用的话,页面一刷新,状态会消失. npm install ...