网站首页 > 博客文章 正文
pageHelper的分页是怎么实现运行的?
下载pageHelper源码,使用pageHelper的官方demo进行Debug试验。
源码地址:
[源码地址] https://gitee.com/free/Mybatis_PageHelper.git%C2%A0
本文使用分支: 4.2
PageHelper.startPage(2, 10, "id desc");
点进第一个断点
PageHelper.startPage
<E> :Element,常表示List<E>,使用泛型的方式是得代码得到复用,达到允许放入不同List的功能。
SqlUtil.getLocalPage:
SqlUtil是BaseSqlUtil的子类,BaseSqlUtil中定义了一个TreadLocal类型的LOCAL_PAGE。
protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
TreadLocal是一个线程内部存储类,可以在指定线程内存储数据副本,数据存储后,只有特定线程可以得到存储数据。
ThreadLocal内部定义了一个静态成员类ThreadLocalMap,其存在的目的就是为了外围类提供数据存储,因此ThreadLocal类似于一个map(),key就是当前的线程,value就是需要存储的对象,可以通过get/set方法得到当前线程存储的数据(value)。
ThreadLoacl.get()
获取当前线程副本中的值。
ThreadLocal.set()
给当前线程副本的value赋值
自此,PageHelper.startPage(2,10)已走完,下面开始执行MyBatis的查询语句。
List<Country> list = countryMapper.selectAll();
MyBatis拦截器
在MyBatis将Java代码转化为SQL之前,会先去BaseSqlUtil中的LOCAL_PAGE变量中获取线程中的分页数据。
而后会走到SqlUtil的doIntercept拦截。
SqlUtil的拦截似乎跟MyBatis并无关系,可实际上在进行拦截时,是走的MyBatis的拦截方法。
原因:
PageHelper类继承自BasePageHelper实现了MyBatis的Interceptor接口使用了MyBatis的Intercepts注解实现拦截。
拦截器的实现在SqlUtil中。
在boundSql这个对象中,是本次根据参数编译出需要执行的SQL语句。
对比调用xml中的SQL:
不能说是一模一样,可以说是完全一致。
拦截器的翻译
编写的xml文件会在本步骤被编译成SQL语句,在数据库中执行。
在执行查询SQL之前,源码中会通过runtimeDialect调用getCountSql方法,先对查询语句做一遍count,如果当然,在查询时,也可以在代码中设置不进行count。
如果统计数大于0,则带着分页参数执行SQL语句,将结果存放到LOCAL_PAGE中,返回查询结果。
返回结果后,关闭本次sqlSession。
来自官方的使用提示:
只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select) 方法会被分页。
作者:FirstMrRight
链接:https://juejin.cn/post/7062155783311458341
猜你喜欢
- 2024-09-26 PageHelper在SpringBoot的@PostConstruct中不生效
- 2024-09-26 面试官:精通 Mybatis?请回答下这几个问题(二)
- 2024-09-26 Mybatis分页插件-PageHelper(mybatis分页插件的缺点)
- 2024-09-26 Mybatis面试题(mybatis面试题csdn)
- 2024-09-26 MyBatis源码分享篇---Plugin插件原理
- 2024-09-26 网易工程师推荐的开源神器,一键解决Mybatis分页问题
- 2024-09-26 PageHelper循环依赖的处理(循环依赖aop)
- 2024-09-26 Spring AOP 实现动态数据源(读写分离),底层原理是什么
- 2024-09-26 服务器端开发-经典面试题(服务器端测试面试题)
- 2024-09-26 PageHelper分页后,对list操作会导致分页无效
你 发表评论:
欢迎- 最近发表
-
- 给3D Slicer添加Python第三方插件库
- Python自动化——pytest常用插件详解
- Pycharm下安装MicroPython Tools插件(ESP32开发板)
- IntelliJ IDEA 2025.1.3 发布(idea 2020)
- IDEA+Continue插件+DeepSeek:开发者效率飙升的「三体组合」!
- Cursor:提升Python开发效率的必备IDE及插件安装指南
- 日本旅行时想借厕所、买香烟怎么办?便利商店里能解决大问题!
- 11天!日本史上最长黄金周来了!旅游万金句总结!
- 北川景子&DAIGO缘定1.11 召开记者会宣布结婚
- PIKO‘PPAP’ 洗脑歌登上美国告示牌
- 标签列表
-
- ifneq (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)