Mybatis分页插件PageHelper的分页原理剖析

 更新时间:2023年08月17日 11:03:28   作者:信仰_273993243  
这篇文章主要介绍了Mybatis分页插件PageHelper的分页原理剖析,PageHelper作为一个启动器,那么就和其他启动器加载一样,先读取spring.factories文件里面配置的类,转成Bean加载本系统中,然后执行他的前置后置处理方法,完成初始化,需要的朋友可以参考下

前言

先说下大致的流程:PageHelper作为一个启动器,那么就和其他启动器加载一样,先读取spring.factories文件里面配置的类,转成Bean加载本系统中

然后执行他的前置后置处理方法,完成初始化,最后当我们执行目标方法时,通过拦截器对目标方法进行拦截,以达到拓展的目的。

一、加载启动器里面的Bean

1、PageHelper的spring.factories

2、里面就包含一个PageHelperAutoConfiguration类这是一个配置类,看下有哪些内容

在方法org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories里面会去加载其他Jar下面的spring.factories文件,然后把文件下配置的类扫描添加到Map里面去。

3、那么spring是在哪里把jar包下面的spring.factories扫描进去的

其他starter的spring.factories加载也是如此

4、加载完之后需要把这个Bean注册到Spring容器中

因为是一个Configuration,所以基本注册成Bean都是在ConfigurationClassPostProcessor里面完成

最终会: org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#registerBeanDefinitionForImportedConfigurationClass 方法里面把PageHelperAutoConfiguration注册到Spring容器中

下面看下PageHelperAutoConfiguration有什么作用

二、实例化PageHelperAutoConfiguration

该方法在实例化Bean的时候,调用BeanPostProcessorsBefore回调方法会触发下面的方法

往sql拦截器链中添加拦截器

三、使用

先看下分页查询的代码

其中有个setLocalPage,就是利用ThreadLocal,设置变量值

public abstract class PageMethod {
    protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
    protected static boolean DEFAULT_COUNT = true;
    /**
     * 设置 Page 参数
     *
     * @param page
     */
    protected static void setLocalPage(Page page) {
        LOCAL_PAGE.set(page);
    }
}

最终在执行sql查询的时候,会触发到拦截器

看下这个拦截器做了什么?

主要是判断是否需要分页,是否需要count操作,等等,最后返回List

到此这篇关于Mybatis分页插件PageHelper的分页原理剖析的文章就介绍到这了,更多相关PageHelper的分页原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决tk.mybatis中写自定义的mapper的问题

    解决tk.mybatis中写自定义的mapper的问题

    这篇文章主要介绍了使用tk.mybatis中写自定义的mapper的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Springboot集成jdbcTemplate过程解析

    Springboot集成jdbcTemplate过程解析

    这篇文章主要介绍了Springboot集成jdbcTemplate过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Spring Web零xml配置原理以及父子容器关系详解

    Spring Web零xml配置原理以及父子容器关系详解

    这篇文章主要介绍了Spring Web零xml配置原理以及父子容器关系详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • SpringBoot2.x 整合 AntiSamy防御XSS攻击的简单总结

    SpringBoot2.x 整合 AntiSamy防御XSS攻击的简单总结

    本文主要对SpringBoot2.x集成AntiSamy防御XSS攻击进行简单总结,其中SpringBoot使用的2.4.5版本,通过示例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-08-08
  • 详解Java的线程状态

    详解Java的线程状态

    本文主要为大家详细介绍一下Java的线程状态,文中的示例代码讲解详细,对我们学习有一定的帮助,感兴趣的小伙伴可以跟随小编学习一下
    2022-11-11
  • mybatis-plus 通用字段自动化(如逻辑删除和更新时间等)

    mybatis-plus 通用字段自动化(如逻辑删除和更新时间等)

    这篇文章主要介绍了mybatis-plus 通用字段自动化(如逻辑删除和更新时间等),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • JAVA技术实现上传下载文件到FTP服务器(完整)

    JAVA技术实现上传下载文件到FTP服务器(完整)

    这篇文章主要介绍了JAVA技术实现上传下载文件到FTP服务器(完整),本文使用 Apache Jakarta Commons Net(commons-net-3.3.jar) 基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作,需要的朋友可以参考下
    2015-07-07
  • maven项目错误:找不到或无法加载主类 XXX问题

    maven项目错误:找不到或无法加载主类 XXX问题

    这篇文章主要介绍了maven项目错误:找不到或无法加载主类 XXX问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python动态类型实现原理及过程解析

    Python动态类型实现原理及过程解析

    这篇文章主要介绍了Python动态类型实现原理及过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 4个Java8中你需要知道的函数式接口分享

    4个Java8中你需要知道的函数式接口分享

    Java 8 中提供了许多函数式接口,包括Function、Consumer、Supplier、Predicate 等等。本文主要来和大家介绍一下它们的具体使用,需要的可以参考一下
    2023-04-04

最新评论