183. Spring Boot MyBatis分页插件原理

Posted SpringBoot

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了183. Spring Boot MyBatis分页插件原理相关的知识,希望对你有一定的参考价值。

【视频&交流平台】

à Spring Boot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Cloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

需求缘起:

       在之前的文章中我们介绍了mybatis的自定义插件以及原理,我们最终的目的是要分析下分页插件的原理。

一、PageHelper是如何在mybatis中工作

PageHelper是如何在mybatis中工作呢,是通过mybatis的pulgin实现了Interceptor接口。这个部分在之前的文章中花了不少篇幅进行介绍了,PageHelper也不另外,如下源码(版本:pagehelper-4.2.1):

183. Spring Boot MyBatis分页插件原理

这里就不过多在进行阐述。这里PageHelper有一个地方就是如何进行分页参数的传递的。


二、PageHelper使用原理

PageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句,所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句。看源码:

       找到startPage代码:

183. Spring Boot MyBatis分页插件原理

最终是执行到代码:

183. Spring Boot MyBatis分页插件原理

       这里有定义了一个Page对象,如下源码:

183. Spring Boot MyBatis分页插件原理

       这里重要的代码:SqlUtil.setLocalPage(page)

       那么LOCAL_PAGE是什么呢?

所以PageHelper就是使用ThreadLocal存储了Page对象,在这个对象中有我们设置的pageNumpageSize,也会查询返回的pagestotal

       好了,就说这么多吧,更深入的东西还需要靠自己去摸索。



以上是关于183. Spring Boot MyBatis分页插件原理的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis 使用Spring boot AOP +自定义注解+PageHelper实现分页

Mybatis 使用Spring boot AOP +自定义注解+PageHelper实现分页

Spring boot mybatis

Spring boot mybatis

Spring boot mybatis

Spring boot mybatis