mybatis 分页插件的使用

项目地址:http://git.oschina.net/free/Mybatis_PageHelper 

文档地址:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown

首先,maven的依赖只是下载jar包而已,可以在其他地方下载jar包,无maven的情况下实现分页需要三步

第一步:下载jar包导入工程。

第二步:然后直接在mybatis中配置<plugins>

第三步:在需要分页的service或者controller中,查询语句前调用PageHelper.startPage(页码, 条数);

(此处需要注意一定要在需要的查询前调用)

 

我用的版本是PageHelper-4.1.1、Mybatis-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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值