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

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 若依框架---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;
}


其中的PageMybatis的分页对象,通过判断其中的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对象的呢?

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
SQL Java 关系型数据库
若依框架---PageHelper分页(十一)
若依框架---PageHelper分页(十一)
512 0
|
SQL Java 数据库连接
若依框架---PageHelper分页(四)
若依框架---PageHelper分页(四)
355 0
|
SQL 数据库
若依框架---PageHelper分页(六)
若依框架---PageHelper分页(六)
370 0
|
消息中间件 数据可视化 Java
Linxu下RocketMq及可视化界面的搭建
Linxu下RocketMq配置信息及可视化界面的搭建
2187 0
|
SQL Oracle 关系型数据库
若依框架---PageHelper分页(五)
若依框架---PageHelper分页(五)
507 0
|
SQL Java 数据库连接
若依框架---PageHelper分页(三)
若依框架---PageHelper分页(三)
516 0
|
监控 NoSQL Java
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
若依(RuoYi)是一款基于Spring Boot和Vue.js的开源Java快速开发脚手架,支持OAuth2、JWT鉴权,集成多种安全框架和持久化框架。它提供了系统管理、监控管理、任务调度、代码生成等常用功能模块,适合中小型公司快速搭建Web应用。本文主要介绍若依框架的特点、版本发展、优缺点及项目部署步骤,帮助开发者快速上手并部署若依项目。
15850 3
若依RuoYi项目环境搭建教程(RuoYi-Vue + RuoYi-Vue3版本)
|
SQL XML JavaScript
【若依Java】15分钟玩转若依二次开发,新手小白半小时实现前后端分离项目,springboot+vue3+Element Plus+vite实现Java项目和管理后台网站功能
摘要: 本文档详细介绍了如何使用若依框架快速搭建一个基于SpringBoot和Vue3的前后端分离的Java管理后台。教程涵盖了技术点、准备工作、启动项目、自动生成代码、数据库配置、菜单管理、代码下载和导入、自定义主题样式、代码生成、启动Vue3项目、修改代码、以及对代码进行自定义和扩展,例如单表和主子表的代码生成、树形表的实现、商品列表和分类列表的改造等。整个过程详细地指导了如何从下载项目到配置数据库,再到生成Java和Vue3代码,最后实现前后端的运行和功能定制。此外,还提供了关于软件安装、环境变量配置和代码自动生成的注意事项。
29642 73
|
SQL 前端开发 Java
若依框架---PageHelper分页(一)
若依框架---PageHelper分页(一)
2188 0
|
缓存 安全 前端开发
来聊聊Java项目分层规范
本文讨论了Java项目的分层规范,强调了分层的重要性以避免代码不易扩展和职责边界模糊。作者分享了阿里提出的六层分层模型(开放接口层、终端显示层、Web层、Service层、Manager层、Mapper层)以及对应的领域模型(DO、DTO、VO、query)。同时,提出了简化版的分层规约,以提高开发效率。作者是CSDN Java博客专家,维护者之一的Java Guide项目,并提供了个人项目结构示例。文章鼓励读者关注其公众号以获取更多交流机会。
3593 4