分页的场景比较常见,下面主要介绍一下使用PageHelper插件进行分页操作:

一、概述:

PageHelper支持对mybatis进行分页操作,项目在github地址:

https://github.com/pagehelper/Mybatis-PageHelper

项目中文官网:

https://pagehelper.github.io/

二、使用(与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对象中取得。

 

最新文章

  1. 转:不再以讹传讹,GET和POST的真正区别
  2. window常见事件
  3. IOS杂记
  4. 从原理上搞定编码(四)-- Base64编码
  5. wcf Svcutil用法
  6. 如何在Html的CSS中去除&lt;li&gt;标签前面小黑点,和ul、LI部分属性方法
  7. RAID0_RAID1_RAID10_RAID5各需几块盘才可组建
  8. Trace和Debug主要用法
  9. SQLserver2012 tcp/ip 1433port问题解决方法
  10. Android——保存并读取文件
  11. 如何使用Maven的archetype快速生成一个新项目(解决生成项目目录不完整问题)
  12. Node.js~在linux上的部署~pm2管理工具的使用
  13. (转) Linux中profile、bashrc、bash_profile之间的区别和联系
  14. Core Animation 文档翻译 (第一篇)
  15. EF+MVC学习中的不理解的问题
  16. .NET CORE 2.0之 依赖注入在类中获取IHostingEnvironment,HttpContext
  17. centos7下安装配置redis
  18. 微软BI 之SSAS 系列 - 多维数据集维度用法之三 多对多维度 Many to Many
  19. JavaScript学习总结(十二)——JavaScript编写类
  20. scrapy有用的(代理,user-agent,随机延迟等)

热门文章

  1. ASP.NET--Repeater控件分页功能实现
  2. python爬虫笔记之用cookie访问需要登录的网站
  3. [leetcode] 105. Construct Binary Tree from Preorder and Inorder Traversal (Medium)
  4. [03] HEVD 内核漏洞之UAF
  5. HTML --- &lt;a href=”#”&gt;与 &lt;a href=”javascript:void(0)” 的区别
  6. excel表数据生成定长txt数据
  7. java练习---1
  8. 面试中的 ThreadLocal 原理和使用场景
  9. iOS程序员 如何提升核心竞争力,防止自己被裁员?
  10. 【python-django后端开发】Redis缓存配置使用详细教程!!!