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

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

在前几篇文章中我们按照PageHelper中对的调用层次依次分析,逐层查找,找到了PageInterceptor拦截器,目前知道是其中的intercept(invocation)方法拦截了Executor.query的sql请求,但是仍然没有找到修改sql的代码是在哪里。


今天我们将揭晓这一重大问题。


接着上次阐述到的PageInterceptor拦截器方法中调用了ExecutorUtil的pageQuery方法,调用方式如下所示:

resultList = ExecutorUtil.pageQuery(dialect, executor,
                        ms, parameter, rowBounds, resultHandler, boundSql, cacheKey);


在这个方法有一个重要的参数dialect,这个是根据不同的数据库去动态匹配不同的实现类。那么它是在何处定义和绑定的呢?


我们在PageInterceptor中查找它的定义:


private volatile Dialect dialect;


这其中有一个修饰符volaile我们不展开讲(主要是我也不是很清楚)。


Dilect是一个接口,其注释中明确写明:数据库方言,针对不同数据库进行实现。我们来看看那其实合适进行绑定的。


在拦截器方法中第一次使用dialect这个变量时,调用了一个方法:

 checkDialectExists();
 // 下述代码是拦截器中首次使用dialect
//对 boundSql 的拦截处理
if (dialect instanceof BoundSqlInterceptor.Chain) {
    boundSql = ((BoundSqlInterceptor.Chain) dialect).doBoundSql(BoundSqlInterceptor.Type.ORIGINAL, boundSql, cacheKey);
}


我们来看一下这个checkDialectExists方法:

/**
     * Spring bean 方式配置时,如果没有配置属性就不会执行下面的 setProperties 方法,就不会初始化
     * <p>
     * 因此这里会出现 null 的情况 fixed #26
     */
    private void checkDialectExists() {
        if (dialect == null) {
            synchronized (default_dialect_class) {
                if (dialect == null) {
                    setProperties(new Properties());
                }
            }
        }
    }


通过其中的dialect == null的两次判断,我们可以知道这个是执行dialect变量初始化的。其初始化方法是setnew Properties(),我们继续来看这个方法以及Properties类。

@Override
public void setProperties(Properties properties) {
    //缓存 count ms
    msCountMap = CacheFactory.createCache(properties.getProperty("msCountCache"), "ms", properties);
    String dialectClass = properties.getProperty("dialect");
    if (StringUtil.isEmpty(dialectClass)) {
        dialectClass = default_dialect_class;
    }
    try {
        Class<?> aClass = Class.forName(dialectClass);
        dialect = (Dialect) aClass.newInstance();
    } catch (Exception e) {
        throw new PageException(e);
    }
    dialect.setProperties(properties);
    String countSuffix = properties.getProperty("countSuffix");
    if (StringUtil.isNotEmpty(countSuffix)) {
        this.countSuffix = countSuffix;
    }
}


我们最关心的还是dialect对象,代码方法中的第二行就为我们指明了其会设置在配置文件的dialect参数中。我们反过来去查看最初若依项目的配置文件:

# PageHelper分页插件
pagehelper: 
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql 


为什么这里的参数dialect与若依代码中的参数名helperDialect不一致呢?


这是因为我们使用的spring-boot,使用的是springboot-pagehelper-starter,在其项目代码中有:

public String getDialect() {
    return properties.getProperty("dialect");
}
public void setDialect(String dialect) {
    properties.setProperty("dialect", dialect);
}
public String getHelperDialect() {
    return properties.getProperty("helperDialect");
}
public void setHelperDialect(String helperDialect) {
    properties.setProperty("helperDialect", helperDialect);
}
目录
相关文章
|
SQL Java 关系型数据库
若依框架---PageHelper分页(十一)
若依框架---PageHelper分页(十一)
579 0
|
SQL Oracle 关系型数据库
若依框架---PageHelper分页(七)
若依框架---PageHelper分页(七)
393 0
|
SQL Java 数据库连接
若依框架---PageHelper分页(四)
若依框架---PageHelper分页(四)
388 0
|
NoSQL Redis 数据安全/隐私保护
若依框架----token权限控制逻辑
若依框架----token权限控制逻辑
1818 0
|
监控 Java 应用服务中间件
谈谈你对spring boot 3.0的理解
1. Java 版本要求:Spring Boot 3.0 要求使用 Java 17 或更高版本,这可能会对一些仍在使用旧版 Java 的项目造成兼容性问题。需要确保项目使用的 Java 版本符合要求,并考虑是否需要升级 JDK 版本。 2. 底层依赖项迁移:Spring Boot 3.0 将所有底层依赖项从 Java EE 迁移到了 Jakarta EE API,基于 Jakarta EE 9 并尽可能地兼容 Jakarta EE 10。这可能会对一些使用了 Java EE 的应用造成影响,需要进行相应的修改和调整。 3. 插件和库的支持:尽管 Spring Boot 3.0 支持更多的插件和
1865 0
|
5月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
1709 8
|
SQL Oracle 关系型数据库
若依框架---PageHelper分页(五)
若依框架---PageHelper分页(五)
540 0
|
SQL Java 数据库连接
若依框架---PageHelper分页(三)
若依框架---PageHelper分页(三)
557 0
|
SQL 安全 关系型数据库
Kingbase(人大金仓数据库)(总结全网精华,虚拟机:从安装到操作数据库一条龙)
KingbaseES 是一款由中国人大金仓信息技术股份有限公司自主研发的通用关系型数据库管理系统(RDBMS),专为中国市场设计,广泛应用于政府、金融、能源、电信等多个关键行业。它是国产数据库的代表之一,以其高安全性、高可用性和高性能著称,符合中国信息技术领域的自主可控要求。以下是关于KingbaseES的一些关键特点和功能:
3241 1
|
监控 数据可视化 数据挖掘
InfluxDB查询语言Flux详解
【4月更文挑战第30天】InfluxDB的查询语言Flux是种函数式、声明性的脚本语言,用于处理时序数据。它包含管道操作符(`|`)来串联函数,内置函数如`range`、`filter`和`mean`,以及变量和运算符支持。Flux适用于实时监控、趋势分析、数据可视化等场景,帮助用户实现灵活高效的查询操作。了解其基本概念和语法,能提升时序数据分析的效率。
2006 1

热门文章

最新文章