若依框架---PageHelper分页(一)

简介: 若依框架---PageHelper分页(一)

我们简单阐述了若依系统中的分页架构,若依系统中的后端分页主要代码接口的三个特点:


  1. 返回值类型为TableDataInfo
  2. 接口第一行代码startPage()
  3. 接口最后一句:getDataTable(list)


获取分页参数


我们已经看到了TableDataInfo的数据结构,就是一个分页的数据结构,有total,有rows数据。

今天我们来看看startPage()时执行了什么逻辑。startPage方法位于基类BaseController中。


代码如下:


/**
     * 设置请求分页数据
     */
    protected void startPage()
    {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize))
        {
            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
            Boolean reasonable = pageDomain.getReasonable();
            PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
        }
    }


我们逐行来分析。


第一行PageDomain pageDomain = TableSupport.buildPageRequest();,引入了一个新的类PageDomain,这个类又是干嘛的呢?

PageDomain的详细结构如下述代码所示。

/**
 * 分页数据
 * 
 * @author ruoyi
 */
public class PageDomain
{
    /** 当前记录起始索引 */
    private Integer pageNum;
    /** 每页显示记录数 */
    private Integer pageSize;
    /** 排序列 */
    private String orderByColumn;
    /** 排序的方向desc或者asc */
    private String isAsc = "asc";
    /** 分页参数合理化 */
    private Boolean reasonable = true;

其中包含了pageNum与pageSize分页参数,还有排序列以及排序方式。那么TableSupport.buildPageRequest()是如何获取到这些参数的呢?


其详细代码如下所示。

    public static PageDomain buildPageRequest()
    {
        return getPageDomain();
    }
}
/**
     * 封装分页对象
     */
    public static PageDomain getPageDomain()
    {
        PageDomain pageDomain = new PageDomain();
        pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM));
        pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE));
        pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
        pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
        pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
        return pageDomain;
    }


在方法内部,调用了函数 getPageDomain(),在getPageDomain()中,获取请求参数时使用了一个工具类方法:ServletUtils.getParameterToInt,我们再来看看这方法。

public class ServletUtils
{
    /**
     * 获取String参数
     */
    public static String getParameter(String name)
    {
        return getRequest().getParameter(name);
    }
    // 其他方法....
}


如何便逐层将前端Request的分页参数获取到了对象pageDomain中。


那么分页参数又是如何转换为sql执行的呢?


代码查找


接着研究startPage()方法,后续一句代码为:

String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());


我们来看看这个方法的内部。

/**
     * 检查字符,防止注入绕过
     */
    public static String escapeOrderBySql(String value)
    {
        if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value))
        {
            throw new UtilException("参数不符合规范,不能进行查询");
        }
        return value;
    }


这个方法知识检查order_by sql语句是否合法的。


接着,我们来到了关键的:PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);


其中的startPage方法,我们来看看其执行代码:

/**抽象类:PageMethod中*/
public static <E> com.github.pagehelper.Page<E> startPage(int pageNum, int pageSize, java.lang.String orderBy) {
    return null;
  }


哦~经过询问度娘,我们知道,这个是一个与mybatis相关的分页工具,叫PageHelper,孤陋寡闻了。

<!-- pagehelper 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
        </dependency>


在配置文件application.yml中:

# PageHelper分页插件
pagehelper: 
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql 
目录
相关文章
|
SQL Oracle 关系型数据库
若依框架---PageHelper分页(七)
若依框架---PageHelper分页(七)
300 0
|
SQL Java 数据库连接
若依框架---PageHelper分页(四)
若依框架---PageHelper分页(四)
268 0
|
SQL Java 关系型数据库
若依框架---PageHelper分页(十一)
若依框架---PageHelper分页(十一)
378 0
|
SQL 数据库
若依框架---PageHelper分页(六)
若依框架---PageHelper分页(六)
276 0
|
SQL 监控 NoSQL
架构师第一课,一文带你玩转 ruoyi 架构
我理解的架构/框架应该有以下功能: 1.满足日常开发功能,如单点登陆、消息队列、监控等; 2.规范开发者的开发,指定代码格式、注释等; 3.提高开发效率,提供一系列的封装方法,并减少bug的产生率。 下文将详细介绍ruoyi框架。
8076 1
架构师第一课,一文带你玩转 ruoyi 架构
|
SQL Java 数据库连接
若依框架---PageHelper分页(三)
若依框架---PageHelper分页(三)
407 0
|
SQL Oracle 关系型数据库
若依框架---PageHelper分页(五)
若依框架---PageHelper分页(五)
387 0
|
SQL XML JavaScript
【若依Java】15分钟玩转若依二次开发,新手小白半小时实现前后端分离项目,springboot+vue3+Element Plus+vite实现Java项目和管理后台网站功能
摘要: 本文档详细介绍了如何使用若依框架快速搭建一个基于SpringBoot和Vue3的前后端分离的Java管理后台。教程涵盖了技术点、准备工作、启动项目、自动生成代码、数据库配置、菜单管理、代码下载和导入、自定义主题样式、代码生成、启动Vue3项目、修改代码、以及对代码进行自定义和扩展,例如单表和主子表的代码生成、树形表的实现、商品列表和分类列表的改造等。整个过程详细地指导了如何从下载项目到配置数据库,再到生成Java和Vue3代码,最后实现前后端的运行和功能定制。此外,还提供了关于软件安装、环境变量配置和代码自动生成的注意事项。
21212 67
|
SQL 安全 Java
若依框架---PageHelper分页(二)
若依框架---PageHelper分页(二)
368 0
|
SQL XML Java
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
ruoyi若依框架@DataScope注解使用以及碰到的一些问题
3984 0