Mybatis中使用PageHelper插件进行分页
分页的场景比较常见,下面主要介绍一下使用PageHelper插件进行分页操作:
一、概述:
PageHelper支持对mybatis进行分页操作,项目在github地址:
https://github.com/pagehelper/Mybatis-PageHelper;
项目中文官网:
二、使用(与springboot集成):
springboot相比于spring,相关配置都可以在代码中完成,和之前通过xml配置的方式不同。
1. mybatis数据源配置中,对sqlSessionFactory bean对象配置的时候,声明定义PageHelper对象,对sessionFactory对象设置此分页对象插件:
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource); // 分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("reasonable", "true");
properties.setProperty("supportMethodsArguments", "true");
properties.setProperty("returnPageInfo", "check");
properties.setProperty("params", "count=countSql");
pageHelper.setProperties(properties); // 添加插件
bean.setPlugins(new Interceptor[] { pageHelper });
如上代码,设置了分页插件的相关参数,相关参数的配置与效果可以进入插件官网查看。
2. 在需要分页的地方:
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.queryList(1);
如上,调用了PageHelper的startPage方法,传入第几页以及每页的记录数,这样就可以查询出对应的记录;
如果需要获取查询记录的总页数以及总记录数:
Page<?> page = PageHelper.startPage(1, 10);
List<Country> list = countryMapper.queryList(1);
int pages = page.getPages();
int total = (int)page.getTotal();
三、原理:
上面介绍了PageHelper插件分页功能的使用,总体来说还是比较方便的,不需要自己再去做额外的处理;
name为什么使用了如下语句之后,就可以生效呢?
PageHelper.startPage(1, 10); 简单的看下这个方法的源码,一直追踪下去,可以发现最终调用的是这个方法:
public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {
Page<E> page = new Page<E>(pageNum, pageSize, count);
page.setReasonable(reasonable);
page.setPageSizeZero(pageSizeZero); Page<E> oldPage = SqlUtil.getLocalPage();
if (oldPage != null && oldPage.isOrderByOnly()) {
page.setOrderBy(oldPage.getOrderBy());
}
SqlUtil.setLocalPage(page);
return page;
}
可以看到,传入的pageNumber与pageSize最后是调用 SqlUtil.setLocalPage(page) 方法存了起来,我们看下这个方法:
public static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}
那么这个LOCAL_PAGE对象是什么呢?
private static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
其实就是一个threadlocal对象,用来存当前线程下pagenumber与pagesize;
那么可以推测,mybaits在执行查询的时候,由于设置了分页插件拦截器,会对查询sql进行处理,拼接对应页的查询语句,那么具体是哪一页以及每页有多少条记录,这些信息
就可以从这个threadlocal对象中取得。
最新文章
- 转:不再以讹传讹,GET和POST的真正区别
- window常见事件
- IOS杂记
- 从原理上搞定编码(四)-- Base64编码
- wcf Svcutil用法
- 如何在Html的CSS中去除<;li>;标签前面小黑点,和ul、LI部分属性方法
- RAID0_RAID1_RAID10_RAID5各需几块盘才可组建
- Trace和Debug主要用法
- SQLserver2012 tcp/ip 1433port问题解决方法
- Android——保存并读取文件
- 如何使用Maven的archetype快速生成一个新项目(解决生成项目目录不完整问题)
- Node.js~在linux上的部署~pm2管理工具的使用
- (转) Linux中profile、bashrc、bash_profile之间的区别和联系
- Core Animation 文档翻译 (第一篇)
- EF+MVC学习中的不理解的问题
- .NET CORE 2.0之 依赖注入在类中获取IHostingEnvironment,HttpContext
- centos7下安装配置redis
- 微软BI 之SSAS 系列 - 多维数据集维度用法之三 多对多维度 Many to Many
- JavaScript学习总结(十二)——JavaScript编写类
- scrapy有用的(代理,user-agent,随机延迟等)
热门文章
- ASP.NET--Repeater控件分页功能实现
- python爬虫笔记之用cookie访问需要登录的网站
- [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)
- [03] HEVD 内核漏洞之UAF
- HTML --- <;a href=”#”>;与 <;a href=”javascript:void(0)” 的区别
- excel表数据生成定长txt数据
- java练习---1
- 面试中的 ThreadLocal 原理和使用场景
- iOS程序员 如何提升核心竞争力,防止自己被裁员?
- 【python-django后端开发】Redis缓存配置使用详细教程!!!