Mybatis的分页插件PageHelper

 
我用的版本是PageHelper-4.1.1Mybatis-3.3.0
PageHelper 依赖于 jsqlparser-0.9.4.jar

添加如下依赖:

  1. <dependency>
  2. <groupId>com.github.pagehelper</groupId>
  3. <artifactId>pagehelper</artifactId>
  4. <version>4.1.6</version>
  5. </dependency>

当使用maven中央库中的快照版(带"-SNAPSHOT"的版本)时,需要在pom.xml中添加如下配置:

  1. <repositories>
  2. <repository>
  3. <id>sonatype-nexus-snapshots</id>
  4. <name>Sonatype Nexus Snapshots</name>
  5. <url>http://oss.sonatype.org/content/repositories/snapshots</url>
  6. <releases>
  7. <enabled>false</enabled>
  8. </releases>
  9. <snapshots>
  10. <enabled>true</enabled>
  11. </snapshots>
  12. </repository>
  13. </repositories>

2. 在Mybatis配置mybatis-config.xml中配置拦截器插件:

plugins插件的配置在 settings之后 在environments之前

  1. <!--
  2. plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
  3. properties?, settings?,
  4. typeAliases?, typeHandlers?,
  5. objectFactory?,objectWrapperFactory?,
  6. plugins?,
  7. environments?, databaseIdProvider?, mappers?
  8. -->
  9. <plugins>
  10. <!-- com.github.pagehelper为PageHelper类所在包名 -->
  11. <plugin interceptor="com.github.pagehelper.PageHelper">
  12. <!-- 4.0.0以后版本可以不设置该参数 -->
  13. <property name="dialect" value="mysql"/>
  14. <!-- 该参数默认为false -->
  15. <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
  16. <!-- 和startPage中的pageNum效果一样-->
  17. <property name="offsetAsPageNum" value="true"/>
  18. <!-- 该参数默认为false -->
  19. <!-- 设置为true时,使用RowBounds分页会进行count查询 -->
  20. <property name="rowBoundsWithCount" value="true"/>
  21. <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
  22. <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
  23. <property name="pageSizeZero" value="true"/>
  24. <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
  25. <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
  26. <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
  27. <property name="reasonable" value="false"/>
  28. <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
  29. <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
  30. <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
  31. <!-- 不理解该含义的前提下,不要随便复制该配置 -->
  32. <property name="params" value="pageNum=pageHelperStart;pageSize=pageHelperRows;"/>
  33. <!-- 支持通过Mapper接口参数来传递分页参数 -->
  34. <property name="supportMethodsArguments" value="false"/>
  35. <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
  36. <property name="returnPageInfo" value="none"/>
  37. </plugin>
  38. </plugins>
pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句
PageHelper只对紧跟着的第一个SQL语句起作用
如上:所以若一个方法中涉及到多个查询,需要小心,避免为不需要分页的添加了分页,而真正需要分页的却没有被分页

测试

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @ContextConfiguration(value = {"classpath:spring/spring-*.xml"})
  3. public class TestPageHelper {
  4.  
  5. @Resource
  6. private TbItemMapper itemMapper;
  7.  
  8. @Test
  9. public void testPageHelper() throws Exception {
  10. //2、设置分页,第104页,每页显示30条
  11. PageHelper.startPage(104, 30);
  12. //3、执行查询
  13. TbItem item = new TbItem();
  14. List<TbItem> list = itemMapper.selectBySelective(item);
  15. //4、取分页后结果
  16. PageInfo<TbItem> pageInfo = new PageInfo<>(list);
  17. int pageNum = pageInfo.getPageNum();
  18. System.out.println("当前是第几页:" + pageNum);
  19. int pageSize = pageInfo.getPageSize();
  20. System.out.println("当前页最多显示几条:" + pageSize);
  21. int size = pageInfo.getSize();
  22. System.out.println("当前页有几条记录:" + size);
  23. int startRow = pageInfo.getStartRow();
  24. System.out.println("当前页开始记录:" + startRow);
  25. int endRow = pageInfo.getEndRow();
  26. System.out.println("当前页最后一条记录:" + endRow);
  27. long total = pageInfo.getTotal();
  28. System.out.println("总共查出来多少条记录:" + total);
  29. int pages = pageInfo.getPages();
  30. System.out.println("总共有多少页:" + pages);
  31. }
  32. }

结果

  1. 当前是第几页:104
  2. 当前页最多显示几条:30
  3. 当前页有几条记录:6
  4. 当前页开始记录:3091
  5. 当前页最后一条记录:3096
  6. 总共查出来多少条记录:3096
  7. 总共有多少页:104

Mybatis的分页插件PageHelper的更多相关文章

  1. SpringBoot集成MyBatis的分页插件 PageHelper

    首先说说MyBatis框架的PageHelper插件吧,它是一个非常好用的分页插件,通常我们的项目中如果集成了MyBatis的话,几乎都会用到它,因为分页的业务逻辑说复杂也不复杂,但是有插件我们何乐而 ...

  2. Mybatis之分页插件pagehelper的简单使用

    最近从家里回来之后一直在想着减肥的事情,一个月都没更新博客了,今天下午没睡午觉就想着把mybatis的分页插件了解一下,由于上个月重新恢复了系统,之前创建的项目都没了,又重新创建了一个项目. 一.创建 ...

  3. Spring Boot系列教程八: Mybatis使用分页插件PageHelper

    一.前言 上篇博客中介绍了spring boot集成mybatis的方法,基于上篇文章这里主要介绍如何使用分页插件PageHelper.在MyBatis中提供了拦截器接口,我们可以使用PageHelp ...

  4. Spring Boot系列教程十一: Mybatis使用分页插件PageHelper

    一.前言 上篇博客中介绍了spring boot集成mybatis的方法,基于上篇文章这里主要介绍如何使用分页插件PageHelper.在MyBatis中提供了拦截器接口,我们可以使用PageHelp ...

  5. 理解 Mybatis的分页插件 PageHelper

    Mybatis + SpringMVC + Maven实现分页查询 (推荐采用的插件是PageHelper) 先看一下之前的这篇博客,这里推荐了 Mybatis 的分页方法. 按照上面的方法设置后,确 ...

  6. Mybatis的分页插件PageHelper分页失效的原因

    引用博客:个人博客地址:https://alexaccele.github.io/ PageHelper是Mybatis的一个很好的分页插件,但要使用它的分页功能需要注意一下几点 1.导入相关包,例如 ...

  7. Mybatis 的分页插件 PageHelper

    我用的版本是PageHelper-4.1.1.Mybatis-3.3.0 PageHelper 依赖于 jsqlparser-0.9.4.jar   使用方法: 1.根据Mybatis的版本下载对应版 ...

  8. 学习Spring Boot:(八)Mybatis使用分页插件PageHelper

    首先Mybqtis可以通过SQL 的方式实现分页很简单,只要在查询SQL 后面加上limit #{currIndex} , #{pageSize}就可以了. 本文主要介绍使用拦截器的方式实现分页. 实 ...

  9. MyBatis之分页插件(PageHelper)工作原理

      数据分页功能是我们软件系统中必备的功能,在持久层使用mybatis的情况下,pageHelper来实现后台分页则是我们常用的一个选择,所以本文专门类介绍下. PageHelper原理 相关依赖 & ...

随机推荐

  1. BZOJ2783: [JLOI2012]树

    Description 数列 提交文件:sequence.pas/c/cpp 输入文件:sequence.in 输出文件:sequence.out 问题描述: 把一个正整数分成一列连续的正整数之和.这 ...

  2. 关于TbSchedule任务调度管理框架的整合部署

    一.前言 任务调度管理作为基础架构通常会出现于我们的业务系统中,目的是让各种任务能够按计划有序执行.比如定时给用户发送邮件.将数据表中的数据同步到另一个数据表都是一个任务,这些相对耗时的操作通过任务调 ...

  3. java:正则移出html元素

    package com.loongtao.general.crawler.slave; import java.util.regex.Matcher; import java.util.regex.P ...

  4. Centos下设置静态IP

    使用VirtualBox装了很多虚拟机,默认采用的DHCP的方式,但是随着虚拟机越来越多以后,这种方式很不方便,所以需要将机器的IP都设置为静态IP 需要添加的几项内容的解释:IPADDR    IP ...

  5. NSString 处理技巧:分割字符串

    摘要 string类型是objective-c中用的最多的类型之一,有时会出现字符串中有我们不想要的字符. 如 "hello world"中的空格,或是"hello/wo ...

  6. MUI - 手势

    www.bcty365.com/content-146-2389-1.html 配置事件 mui.init({ gestureConfig: { hold: true, //长按屏幕,默认是false ...

  7. php函数描述及例子

    /** * xml2array() will convert the given XML text to an array in the XML structure. * Link: http://w ...

  8. PDO 学习与使用 ( 二 ) PDO 数据提取 和 预处理语句

    以数据库 msg 为例,说明 PDO 的数据提取.预处理语句: mysql> show tables;+---------------+| Tables_in_msg |+----------- ...

  9. md5只是用来签名,签名的作用是保证数据完整不会被破坏而已。签名和加密是两回事

    md5只是用来签名,签名的作用是保证数据完整不会被破坏而已,多一个sign标签,sign的值就是md5生成的字符串.签名和加密是两回事

  10. VIM常用快捷键~网页上查找

    转自~木枫林 转自~鸟哥的私房菜 第十章.vim 程序编辑器 第十章.vim 程序编辑器 最近更新日期:2009/08/20 2. vi 的使用 2.1 简易执行范例 2.2 按键说明 2.3 一个案 ...