网站首页 > 博客文章 正文
背景
有次在同事群里分享了mybatis分页拦截器的使用,有大佬回复介绍了一个开源的PageHelper工具,就去了解学习了一下!没想到很好用。
完整个人面经、笔记梳理和Java架构资料分享(200+页PDF),私信我就可以发给你哈~
简单介绍
首先甩出一个GitHub链接:https://github.com/pagehelper/Mybatis-PageHelper
简单地看了一下源码,其实实际的原理是一样的,自定义了一个分页的拦截器,不过PageHelper拦截的方法是Executor.class中的query方法。
观察源码会发现,PageHelper在完成了select count(1)即计数的功能之后,对于原sql的分页查询,全部在Interceptor中完成了,而不是在select count(1)之后,修改原sql,继续由invocation.proceed()来执行:
// PageInterceptor第113行,查询数量
count = executeAutoCount(executor, countMs, parameter, boundSql, rowBounds, resultHandler);
// PageInterceptor第135行
//执行分页
resultList = executor.query(ms, parameter, RowBounds.DEFAULT, resultHandler, pageKey, pageBoundSql);
// 对查询出来的结果进行处理,转换为自定义的Page对象
return dialect.afterPage(resultList, parameter, rowBounds);
这样做的好处就是可以在sql查询完成之后,继续对返回的List进行处理,例如PageHelper在afterPage方法中做的就是讲返回的List对象中的数据取出,放到Page对象中(Page是继承自List的类,其中增加了pageNum、pageSize、total之类的属性)
示例
首先还是要给sqlSessionFactoryBean注册plugin,不过这一次不能直接在SQLSessionFactoryBean中写入了,因为PageInterceptor需要通过setProperties(Properties properties)方法初始化dialect,如果直接在application-database中通过标签向Spring注册bean,那么这个方法就不会被调用,导致后续的NullPoint异常。
正确的方式是,通过mybatis的config.xml注册plugin:
// 错误方式
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="configLocation" value="classpath:mybatis/config.xml"/>
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"/>
<property name="dataSource" ref="dataSource"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor"/>
</array>
</property>
</bean>
// 正确方式
在SQLSessionFactoryBean中引入的config.xml中加入:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
接下来,只要在需要使用分页的地方先写一次分页参数:
PageHelper.startPage(1, 5);
然后继续执行dao方法,就可以完成分页:
List<String> testList = sampleDao.listTitle(4281);
此处虽然我是使用List来接受的结果,实际上这是一个Page对象,若想要获得total、pageNum、pageSize等信息,可以直接用Page来接受结果,或者用PageInfo对象来转换结果:
Page<String> testPage = sampleDao.listTitle(4281);
或者:
List<String> testList = sampleDao.listTitle(4281);
PageInfo<String> pageInfo = new PageInfo<>(testList);
结论
总体而言,PageHelper确实比自己造一个轮子要方便实用的多。
再写两个遇到的坑...
- 引入PageHelper的时候要注意版本,貌似5.0.0之前的版本,拦截器的类是PageHelper,进入5.0.0之后变为了PageInterceptor
- 5.0.0之前,注册plugin时要指定dialect,即加入一个参数;现在是不要指定dialect,会默认指定一个通用的,如果自己写很容易写错,例如我测试时写了一个MySqlDialect,结果这个东西并不是这么用的
来源:网易工程师-邱稳斌
有任何问题欢迎留言交流~
整理总结不易,如果觉得这篇文章有意思的话,欢迎转发、收藏,给我一些鼓励~
有想看的内容或者建议,敬请留言!
最近利用空余时间整理了一些精选Java架构学习视频和大厂项目底层知识点,需要的同学欢迎私信我发给你~一起学习进步!有任何问题也欢迎交流~
Java日记本,每日存档超实用的技术干货学习笔记,每天陪你前进一点点~
猜你喜欢
- 2024-09-26 PageHelper在SpringBoot的@PostConstruct中不生效
- 2024-09-26 pageHelper-v4.2源码阅读-分页是怎么实现运行的?
- 2024-09-26 面试官:精通 Mybatis?请回答下这几个问题(二)
- 2024-09-26 Mybatis分页插件-PageHelper(mybatis分页插件的缺点)
- 2024-09-26 Mybatis面试题(mybatis面试题csdn)
- 2024-09-26 MyBatis源码分享篇---Plugin插件原理
- 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)
本文暂时没有评论,来添加一个吧(●'◡'●)