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的分页原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis中使用InsertProvider注解报错解决全过程

    mybatis中使用InsertProvider注解报错解决全过程

    这篇文章主要介绍了mybatis中使用InsertProvider注解报错解决全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Spring Boot和Vue跨域请求问题原理解析

    Spring Boot和Vue跨域请求问题原理解析

    这篇文章主要介绍了Spring Boot和Vue跨域请求问题原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Spring集成MyBatis 及Aop分页的实现代码

    Spring集成MyBatis 及Aop分页的实现代码

    这篇文章主要介绍了Spring集成MyBatis 及Aop分页的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • 深入解析Mybatis中缓存机制及优缺点

    深入解析Mybatis中缓存机制及优缺点

    MyBatis缓存分为一级(SqlSession级,自动维护)和二级(Mapper级,需配置),通过减少数据库访问提升性能,但存在脏数据和分布式不兼容风险,适合高频查询低频修改场景,需合理配置以平衡效率与一致性,本文给介绍Mybatis中缓存机制及优缺点,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • Java小白第一次就能看懂的网络编程

    Java小白第一次就能看懂的网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-08-08
  • IDEA整合Dubbo+Zookeeper+SpringBoot实现

    IDEA整合Dubbo+Zookeeper+SpringBoot实现

    初学者,想自己动手做一个简单的demo,本文主要介绍了IDEA整合Dubbo+Zookeeper+SpringBoot实现,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Springboot接收 Form 表单数据的示例详解

    Springboot接收 Form 表单数据的示例详解

    这篇文章主要介绍了Springboot接收 Form 表单数据的实例代码,本文通过图文实例代码相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • 详解SpringBoot项目整合Vue做一个完整的用户注册功能

    详解SpringBoot项目整合Vue做一个完整的用户注册功能

    本文主要介绍了SpringBoot项目整合Vue做一个完整的用户注册功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 详解SpringMVC中使用Interceptor拦截器

    详解SpringMVC中使用Interceptor拦截器

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理,这篇文章主要介绍了详解SpringMVC中使用Interceptor拦截器,有兴趣的可以了解一下。
    2016-12-12
  • 解决@PostConstruct注解导致的程序无法启动(@PostConstruct的执行)

    解决@PostConstruct注解导致的程序无法启动(@PostConstruct的执行)

    这篇文章主要介绍了解决@PostConstruct注解导致的程序无法启动(@PostConstruct的执行)问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01

最新评论