如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件。

分页插件支持任何复杂的单表、多表分页,部分特殊情况请看重要提示

想要使用分页插件?请看如何使用分页插件

物理分页

该插件目前支持以下数据库的物理分页:

  1. Oracle
  2. Mysql
  3. MariaDB
  4. SQLite
  5. Hsqldb
  6. PostgreSQL
  7. DB2
  8. SqlServer(2005,2008)
  9. Informix
  10. H2
  11. SqlServer2012

配置dialect属性时,可以使用小写形式:

Oracle,MySQL,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012

在4.0.0版本以后,dialect参数可以不配置,系统能自动识别这里提到的所有数据库。

对于不支持的数据库,可以实现com.github.pagehelper.parser.Parser接口,然后配置到dialect参数中(4.0.2版本增加)。

特别注意:使用SqlServer2012数据库时,需要手动指定sqlserver2012,否则会使用2005的方式进行分页。

MyBatis工具网站:http://mybatis.tk

分页插件支持MyBatis3.2.0~3.3.0(包含)

分页插件最新版本为4.1.6

Maven坐标

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

下载JAR包

分页插件pagehelper.jar:

由于使用了sql解析工具,你还需要下载jsqlparser.jar

使用方法

1. 引入分页插件

引入分页插件一共有下面2种方式,推荐使用Maven方式,这种方式方便更新。

1). 引入Jar包

如果你想使用本项目的jar包而不是直接引入类,你可以在这里下载各个版本的jar包(点击Download下的jar即可下载)

由于使用了sql解析工具,你还需要下载jsqlparser.jar(这个文件完全独立,不依赖其他):

2). 使用maven

添加如下依赖:

  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配置xml中配置拦截器插件:

  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>

这里的com.github.pagehelper.PageHelper使用完整的类路径。

其他五个参数说明:

  1. 增加dialect属性,使用时可以指定该属性(不指定的情况下,分页插件会自动判断),可选值为oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012

  2. 增加offsetAsPageNum属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页时,会将offset参数当成pageNum使用,可以用页码和页面大小两个参数进行分页。

  3. 增加rowBoundsWithCount属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,使用RowBounds分页会进行count查询。

  4. 增加pageSizeZero属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。当该参数设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page类型)。

  5. 增加reasonable属性,默认值为false,使用默认值时不需要增加该配置,需要设为true时,需要配置该参数。具体作用请看上面配置文件中的注释内容。

  6. 为了支持startPage(Object params)方法,增加了一个params参数来配置参数映射,用于从Map或ServletRequest中取值,可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值。

  7. supportMethodsArguments支持通过Mapper接口参数来传递分页参数,默认值false,具体用法参考com.github.pagehelper.test.basic包下的ArgumentsMapTestArgumentsObjTest测试类。

  8. returnPageInfo用来支持直接返回PageInfo类型,默认值none,可选参数always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page(List)类型。用法和配置参考com.github.pagehelper.test.basic包下的PageInfoTest,特别要注意接口的返回值和xml中的resultType类型。

  9. 增加closeConn属性,当使用动态数据源或没有设置dialect属性自动获取数据库类型时,会自动获取一个数据库连接,通过该属性来设置是否关闭获取的这个连接,默认true关闭。

重要提示:

offsetAsPageNum=false的时候,由于PageNum问题,RowBounds查询的时候reasonable会强制为false。使用PageHelper.startPage方法不受影响。

另外使用RowBounds在这种情况下返回的Page对象由于没有正确的pageNum属性,所以也不能使用PageInfo处理。

如果你不理解为什么,可以看这样一个例子:查询offset=7,limit=10,这个时候pageNum=?,这种情况没法计算pageNum,没法判断当前是第几页。

3. 如何选择配置这些参数

单独看每个参数的说明可能是一件让人不爽的事情,这里列举一些可能会用到某些参数的情况。

首先dialect属性是必须的,不需要解释。其他的参数一般情况下我们都不必去管,如果想了解何时使用合适,你可以参考以下场景:

场景一

如果你仍然在用类似ibatis式的命名空间调用方式,你也许会用到rowBoundsWithCount,分页插件对RowBounds支持和Mybatis默认的方式是一致,默认情况下不会进行count查询,如果你想在分页查询时进行count查询,以及使用更强大的PageInfo类,你需要设置该参数为true

场景二

如果你仍然在用类似ibatis式的命名空间调用方式,你觉得RowBounds中的两个参数offset,limit不如pageNum,pageSize容易理解,你可以使用offsetAsPageNum参数,将该参数设置为true后,offset会当成pageNum使用,limitpageSize含义相同。

场景三

如果觉得某个地方使用分页后,你仍然想通过控制参数查询全部的结果,你可以配置pageSizeZerotrue,配置后,如可以通过设置pageSize=0或者RowBounds.limit = 0就会查询出全部的结果。

场景四

如果你分页插件使用于类似分页查看列表式的数据,如新闻列表,软件列表,你希望用户输入的页数不在合法范围(第一页到最后一页之外)时能够正确的响应到正确的结果页面,那么你可以配置reasonabletrue,这时如果pageNum<1会查询第一页,如果pageNum>总页数会查询最后一页。

4. Spring配置方法

首先需要在spring中配置org.mybatis.spring.SqlSessionFactoryBean。然后配置配置Mybatis的具体配置有两种方式,一种是用mybatis默认的xml配置,另一种就是完全使用spring的属性配置方式。

1.mybatis默认的xml配置

配置configLocation属性指向上面的mybatis-config.xml文件。有关分页插件的配置都在mybatis-config.xml,具体配置内容参考上面的mybatis-config.xml

2.使用spring的属性配置方式

注意:请不用同时使用spring配置方式和mybatis-config.xml配置方式,只需要选择其中一个就行。配置多个分页插件时,会抛出异常提示。

分页插件配置错误:请不要在系统中配置多个分页插件(使用Spring时,mybatis-config.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!

使用spring的属性配置方式,可以使用plugins属性像下面这样配置:

  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  2. <property name="dataSource" ref="dataSource"/>
  3. <property name="mapperLocations">
  4. <array>
  5. <value>classpath:mapper/*.xml</value>
  6. </array>
  7. </property>
  8. <property name="typeAliasesPackage" value="com.isea533.ssm.model"/>
  9. <property name="plugins">
  10. <array>
  11. <bean class="com.github.pagehelper.PageHelper">
  12. <property name="properties">
  13. <value>
  14. dialect=hsqldb
  15. </value>
  16. </property>
  17. </bean>
  18. </array>
  19. </property>
  20. </bean>

属性配置按照上面的方式配置,每个配置独立一行即可。

5. 如何在代码中使用

阅读前后请注意看重要提示

首先该分页插件支持以下两种调用方式:

  1. //第一种,RowBounds方式的调用
  2. List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));
  3.  
  4. //第二种,Mapper接口方式的调用,推荐这种使用方式。
  5. PageHelper.startPage(1, 10);
  6. List<Country> list = countryMapper.selectIf(1);

下面分别对这两种方式进行详细介绍

1). RowBounds方式的调用

  1. List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));

使用这种调用方式时,你可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容。

分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页。

关于这种方式的调用,有两个特殊的参数是针对RowBounds的,你可以参看上面的场景一场景二

注:不只有命名空间方式可以用RowBounds,使用接口的时候也可以增加RowBounds参数,例如:

  1. //这种情况下也会进行物理分页查询
  2. List<Country> selectAll(RowBounds rowBounds);

2). PageHelper.startPage静态方法调用

在你需要进行分页的Mybatis方法前调用PageHelper.startPage静态方法即可,紧跟在这个方法后的第一个Mybatis查询方法会被进行分页。

例一:
  1. SqlSession sqlSession = MybatisHelper.getSqlSession();
  2. CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class);
  3. try {
  4. //获取第1页,10条内容,默认查询总数count
  5. PageHelper.startPage(1, 10);
  6.  
  7. //紧跟着的第一个select方法会被分页
  8. List<Country> list = countryMapper.selectIf(1);
  9. assertEquals(2, list.get(0).getId());
  10. assertEquals(10, list.size());
  11. //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,
  12. //或者使用PageInfo类(下面的例子有介绍)
  13. assertEquals(182, ((Page) list).getTotal());
  14. } finally {
  15. sqlSession.close();
  16. }
例二:
  1. SqlSession sqlSession = MybatisHelper.getSqlSession();
  2. CountryMapper countryMapper = sqlSession.getMapper(CountryMapper.class);
  3. try {
  4. //获取第1页,10条内容,默认查询总数count
  5. PageHelper.startPage(1, 10);
  6.  
  7. //紧跟着的第一个select方法会被分页
  8. List<Country> list = countryMapper.selectIf(1);
  9.  
  10. //后面的不会被分页,除非再次调用PageHelper.startPage
  11. List<Country> list2 = countryMapper.selectIf(null);
  12. //list1
  13. assertEquals(2, list.get(0).getId());
  14. assertEquals(10, list.size());
  15. //分页时,实际返回的结果list类型是Page<E>,如果想取出分页信息,需要强制转换为Page<E>,
  16. //或者使用PageInfo类(下面的例子有介绍)
  17. assertEquals(182, ((Page) list).getTotal());
  18. //list2
  19. assertEquals(1, list2.get(0).getId());
  20. assertEquals(182, list2.size());
  21. } finally {
  22. sqlSession.close();
  23. }
例三,使用PageInfo的用法:
  1. //获取第1页,10条内容,默认查询总数count
  2. PageHelper.startPage(1, 10);
  3. List<Country> list = countryMapper.selectAll();
  4. //用PageInfo对结果进行包装
  5. PageInfo page = new PageInfo(list);
  6. //测试PageInfo全部属性
  7. //PageInfo包含了非常全面的分页属性
  8. assertEquals(1, page.getPageNum());
  9. assertEquals(10, page.getPageSize());
  10. assertEquals(1, page.getStartRow());
  11. assertEquals(10, page.getEndRow());
  12. assertEquals(183, page.getTotal());
  13. assertEquals(19, page.getPages());
  14. assertEquals(1, page.getFirstPage());
  15. assertEquals(8, page.getLastPage());
  16. assertEquals(true, page.isFirstPage());
  17. assertEquals(false, page.isLastPage());
  18. assertEquals(false, page.isHasPreviousPage());
  19. assertEquals(true, page.isHasNextPage());

本项目中包含大量测试,您可以通过查看测试代码了解使用方法。

测试代码地址:http://git.oschina.net/free/Mybatis_PageHelper/tree/master/src/test/java/com/github/pagehelper/test

MyBatis和Spring集成示例

如果和Spring集成不熟悉,可以参考下面两个

只有基础的配置信息,没有任何现成的功能,作为新手入门搭建框架的基础

这两个集成框架集成了MyBatis分页插件和MyBatis通用Mapper。

MyBatis学习总结_17_Mybatis分页插件PageHelper的更多相关文章

  1. Springboot集成mybatis通用Mapper与分页插件PageHelper

    插件介绍 通用 Mapper 是一个可以实现任意 MyBatis 通用方法的框架,项目提供了常规的增删改查操作以及 Example 相关的单表操作.通用 Mapper 是为了解决 MyBatis 使用 ...

  2. SpringBoot+MyBatis多数据源使用分页插件PageHelper

    之前只用过单数据源下的分页插件,而且几乎不用配置.一个静态方法就能搞定. PageHelper.startPage(pageNum, pageSize); 后来使用了多数据源(不同的数据库),Page ...

  3. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示

    http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ...

  4. Mybatis学习---Mybatis分页插件 - PageHelper

    1. Mybatis分页插件 - PageHelper说明 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件. 该插件目前支持Oracle,Mysql,MariaDB,S ...

  5. MyBatis学习总结(17)——Mybatis分页插件PageHelper

    如果你也在用Mybatis,建议尝试该分页插件,这一定是最方便使用的分页插件. 分页插件支持任何复杂的单表.多表分页,部分特殊情况请看重要提示. 想要使用分页插件?请看如何使用分页插件. 物理分页 该 ...

  6. 【MyBatis】MyBatis分页插件PageHelper的使用

    好多天没写博客了,因为最近在实习,大部分时间在熟悉实习相关的东西,也没有怎么学习新的东西,这周末学习了MyBatis的一个分页插件PageHelper,虽然没有那么的强大(我在最后会说明它的缺点),但 ...

  7. MyBatis 分页插件PageHelper 后台报错

    今天遇到一个问题,使用MyBatis 分页插件PageHelper 进行排序分页后,能正常返回正确的结果,但后台却一直在报错 net.sf.jsqlparser.parser.ParseExcepti ...

  8. Mybatis的分页插件PageHelper

    Mybatis的分页插件PageHelper 项目地址:http://git.oschina.net/free/Mybatis_PageHelper  文档地址:http://git.oschina. ...

  9. mybatis分页插件PageHelper的使用(转)

    Mybatis 的分页插件PageHelper-4.1.1的使用 Mybatis 的分页插件 PageHelper 项目地址:http://git.oschina.net/free/Mybatis_P ...

随机推荐

  1. The underlying JVM is how to realize the synchronized

    http://www.programering.com/a/MjN0IjMwATg.html

  2. android继承Dialog实现自定义对话框

    有时需要自定义对话框,可以使用AlterDialog.Bulider,比如下面的代码片段 new AlertDialog.Builder(self) .setTitle("标题") ...

  3. 团队开发——Alpha版总结会议

    本组目前存在的问题: 1.在选题的时候,题目选的比较有难度,造成后期工作量较大,实现有难度(未能正确估计项目的难度). 2.最初规划时,设计的功能较多,但是技术水平达不到,导致目前完成功能较少. 3. ...

  4. ArrayList、LinkedList、Vector的区别

    Arraylist和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以插入数据慢,查找有下标, ...

  5. 使用JavaScript+Html创建win8应用(一)

            最近在学习win8 metro app的开发,今天刚刚学了一个小的例子,分享一下 开始之前你需要准备... 1.开发win8应用需要具备Windows 8 和 Microsoft Vi ...

  6. 向Array中添加选择排序

    选择排序思路 在无序区中选出最小的元素,然后将它和有序区的第一个元素交换位置. 选择排序实现 Function.prototype.method = function(name, func){ thi ...

  7. Careercup - Microsoft面试题 - 5943729928011776

    2014-05-10 21:56 题目链接 原题: Suppose you get number of unique users every second from bing For eg, ,,,, ...

  8. 【Unique Binary Search Trees】cpp

    题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For e ...

  9. 《IT小小鸟》阅读心得

    我是一个不爱看书的人,认为看那些又臭又长废话连篇的书是在浪费时间,但我不认为在那么多的书中没有好书,在一次的职业生涯规划中老师推荐了这本书,一开始认为不值得一看,但还是拿了起来,读了有不少的感触. 书 ...

  10. max_flow(Ford-Fulkerson) 分类: ACM TYPE 2014-09-02 01:50 110人阅读 评论(0) 收藏

    #include <cstdio> #include <iostream> #include <cstring> #include<queue> usi ...