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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 若依框架---PageHelper分页(五)

在昨天的文章中我们通过研究PageInterceptor拦截器,发现了其中的一个可配置接口Dialect,进而找出来其可通过java.util.Properties来配置实现类从而适配不同的数据库形式,如适配mysql, Oracle等等。


今天,我们紧接着上次查看到的位于ExecutorUtil中的query方法。


我们已经知道dialect在我们的使用场景-若依系统下是mysql的,也就是其对应的是MySqlDialect。我们依次看看分页方法中调用的实现位于哪里?

public static <E> List<E> pageQuery(Dialect dialect, Executor executor, MappedStatement ms, Object parameter,
                                        RowBounds rowBounds, ResultHandler resultHandler,
                                        BoundSql boundSql, CacheKey cacheKey) throws SQLException {
        //判断是否需要进行分页查询
        if (dialect.beforePage(ms, parameter, rowBounds)) {
            //.... 
        }


第一句,判断是否需要进行分页查询,调用了dialect.beforePage方法,我们这次需要逆向的从MySqlDialect找其实现代码在哪里?


MySqlDialect的层次结构


经过梳理 MySqlDialect 的层次如下所示:


Dialect -> AbstractDialect -> AbstractHelperDialect -> MySqlDialect


从各个方法的注释我们来看:


  1. 接口 Dialect: 数据库方言,针对不同数据库进行实现;
  2. 抽象类 AbstractDialect:基于 CountSqlParser 的智能 Count 查询;
  3. 抽象类 AbstractHelperDialect: 针对 PageHelper 的实现;
  4. 实现类 MySqlDialect: 针对mysql数据库的具体实现。


其中方法beforePage(...)的定义与实现是位于哪里呢?既然在调用时是以Dialect调用的,因此我们知道,定义肯定是位于最高层接口Dialect中,那么实现又在哪里呢?


通过逐层查找,beforePage(...)位于第三层类AbstractHelperDialect中。代码如下:

@Override
public boolean beforePage(MappedStatement ms, Object parameterObject, RowBounds rowBounds) {
    Page page = getLocalPage();
    if (page.isOrderByOnly() || page.getPageSize() > 0) {
        return true;
    }
    return false;
}


其中的Page是Mybatis的分页对象,通过判断其中的isOrderByOnlypageSize参数判断SQL是否需要分页,如果需要分页则返回true,不需要分页则返回false


Page的几个变量与注释如下:

public class Page<E> extends ArrayList<E> implements Closeable {
    private static final long serialVersionUID = 1L;
    private int pageNum;
    private int pageSize;
    private long startRow;
    private long endRow;
    private long total;
    /**
     * 总页数
     */
    private int pages;
    /**
     * 包含count查询
     */
    private boolean count = true;
    /**
     * 分页合理化
     */
    private Boolean reasonable;
    /**
     * 当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果
     */
    private           Boolean                   pageSizeZero;
    /**
     * 进行count查询的列名
     */
    private           String                    countColumn;
    /**
     * 排序
     */
    private           String                    orderBy;
    /**
     * 只增加排序
     */
    private           boolean                   orderByOnly;


那么这个Page参数又是何时设置的呢?其中的orderByOnlypageSize是通过何种逻辑设置,又是如何在此处获取到该SQL执行时的Page对象的呢?

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
2月前
|
SQL Oracle 关系型数据库
若依框架---PageHelper分页(七)
若依框架---PageHelper分页(七)
69 0
|
2月前
|
SQL 数据库
若依框架---PageHelper分页(六)
若依框架---PageHelper分页(六)
74 0
|
2月前
|
SQL Java 数据库连接
若依框架---PageHelper分页(四)
若依框架---PageHelper分页(四)
86 0
|
2月前
|
SQL Java 关系型数据库
若依框架---PageHelper分页(十一)
若依框架---PageHelper分页(十一)
92 0
|
2月前
|
SQL Java 数据库连接
若依框架---PageHelper分页(三)
若依框架---PageHelper分页(三)
126 0
|
2月前
|
SQL Java 关系型数据库
PageHelper分页插件最新源码解读及使用
PageHelper分页插件最新源码解读及使用
|
2月前
|
前端开发 关系型数据库 MySQL
springboot+jpa+tymeleaf实现分页功能
springboot+jpa+tymeleaf实现分页功能
18 0
|
2月前
|
SQL 安全 Java
若依框架---PageHelper分页(二)
若依框架---PageHelper分页(二)
103 0
|
2月前
|
SQL 监控 Java
若依框架---PageHelper分页(十)
若依框架---PageHelper分页(十)
71 0
|
2月前
|
SQL 缓存
若依框架---PageHelper分页(九)
若依框架---PageHelper分页(九)
52 0