PageHelper

  • 添加maven依赖
  • 在Mybatis的配置文件 Mybatis-Config.xml中配置PageHelper插件
  • 原理
  • 注意
  • 使用
  • 默认值
    • PageHelp 在获取 count 的时候 过滤 order by 导致 总数不正确问题
    • mybaits中使用pageHelper 进行一对都分页时结果不对的处理方式
    • spring mvc+mybatis项目中,当使用PageHelper插件进行分页查询时,查到的总数据量值是正确的,但是查询当前页返回的列表个数不对。比如每页查询10条,返回2条或者3条。resultMap使用了association返回复杂属性。

添加maven依赖

    <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.8</version></dependency>

在Mybatis的配置文件 Mybatis-Config.xml中配置PageHelper插件

     <plugins><plugin interceptor="com.github.pagehelper.PageHelper"><property name="dialect" value="oracle"/><property name="offsetAsPageNum" value="false"/><property name="rowBoundsWithCount" value="false"/><property name="pageSizeZero" value="true"/><property name="reasonable" value="false"/><property name="supportMethodsArguments" value="false"/><property name="returnPageInfo" value="none"/></plugin></plugins>
  1. plugins插件的配置在 settings之后 在environments之前
  2. settings中设置Mybatis的一些额外的运行参数 如是否开启延迟加载,动态代理使用CG-LIB,或JAVALIB等;

原理

pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句

注意

PageHelper只对紧跟着的第一个SQL语句起作用。所以若一个方法中涉及到多个查询,需要小心,避免为不需要分页的添加了分页,而真正需要分页的却没有被分页。

使用

1)、统计总数,(将SQL语句变为 select count(0) from xxx,只对简单SQL语句其效果,复杂SQL语句需要自己写)Page<?> page = PageHelper.startPage(1,-1);long count = page.getTotal();
2)、分页,pageNum - 第N页, pageSize - 每页M条数A、只分页不统计(每次只执行分页语句)PageHelper.startPage([pageNum],[pageSize]);List<?> pagelist = queryForList( xxx.class, "queryAll" , param);//pagelist就是分页之后的结果B、分页并统计(每次执行2条语句,一条select count语句,一条分页语句)适用于查询分页时数据发生变动,需要将实时的变动信息反映到分页结果上Page<?> page = PageHelper.startPage([pageNum],[pageSize],[iscount]);List<?> pagelist = queryForList( xxx.class , "queryAll" , param);long count = page.getTotal();//也可以 List<?> pagelist = page.getList();  获取分页后的结果集
3)、使用PageHelper查全部(不分页)PageHelper.startPage(1,0);List<?> alllist = queryForList( xxx.class , "queryAll" , param);
4)、PageHelper的其他APIString orderBy = PageHelper.getOrderBy();    //获取orderBy语句Page<?> page = PageHelper.startPage(Object params);Page<?> page = PageHelper.startPage(int pageNum, int pageSize);Page<?> page = PageHelper.startPage(int pageNum, int pageSize, boolean isCount);Page<?> page = PageHelper.startPage(pageNum, pageSize, orderBy);Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable);    //isReasonable分页合理化,null时用默认配置Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable, isPageSizeZero);    //isPageSizeZero是否支持PageSize为0,true且pageSize=0时返回全部结果,false时分页,null时用默认配置

默认值

     //RowBounds参数offset作为PageNum使用 - 默认不使用private boolean offsetAsPageNum = false;//RowBounds是否进行count查询 - 默认不查询private boolean rowBoundsWithCount = false;//当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果private boolean pageSizeZero = false;//分页合理化private boolean reasonable = false;//是否支持接口参数来传递分页参数,默认falseprivate boolean supportMethodsArguments = false;

PageHelp 在获取 count 的时候 过滤 order by 导致 总数不正确问题

pageHelp 获取count的时候会默认把order by 过滤掉,有可能会导致实际总数与查出来的总数不一样的情况。只要在需要不过滤的order by 前面添加 /keep orderby/ 注解后,pageHelp 就会忽略不过滤order by。

mybaits中使用pageHelper 进行一对都分页时结果不对的处理方式

  1. pageHelper遇到resultMap的collection后,分页总数不对。

由于PageHelper分页总数是根据count(0)来计算出来的(即自动生成一条SQL select count(0) from xx where 筛选条件),而collection会把结果集合并(一对多的情况),计算总数在合并结果集之前,所以计算的总数不对。

  1. pageHelper遇到resultMap的collection后,分页结果集不对。

同计数的原理一样,分页实际是在合并结果集之前进行的(即直接在查询SQL语句后面加了limit x,x),这就导致了存在一对多情况时,实际返回的结果集个数与分页要求的每页结果集个数不一致,且如果最后一条记录也涉及一对多时,结果集内容也不一定准确。

  1. 解决方法

需要使用pageHelper分页时,resultMap不要用嵌套结果的方式,可以使用嵌套查询的方式

spring mvc+mybatis项目中,当使用PageHelper插件进行分页查询时,查到的总数据量值是正确的,但是查询当前页返回的列表个数不对。比如每页查询10条,返回2条或者3条。resultMap使用了association返回复杂属性。

  1. 原因
是当resultMap使用<result />  <association/>返回,当<result />对应的属性有重复值时,只加载一个。是当resultMap使用<result />  <association/>返回,当<result/>对应的属性有重复值时,只加载一个。
  1. 解决方法:
resultMap中增加<id />的返回,保证数据的唯一性。

PageHelper介绍相关推荐

  1. SpringBoot分页组件PageHelper介绍及使用

    2019独角兽企业重金招聘Python工程师标准>>> 这篇主要说一下上篇介绍的mybatis分页组件,如果你们觉得没必要,非要自己封装分页,也是可以的啦,就像博主上一篇,自己写个分 ...

  2. PageHelper概述与基本使用步骤介绍

    订单分页查询 PageHelper介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql.oracle.mariaDB.DB2.SQL ...

  3. 分页插件 - PageHelper的介绍和使用

    PageHelper介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql. oracle.mariaDB.DB2.SQLite.Hs ...

  4. Spring Boot入门系列(十六)整合pagehelper,一秒实现分页功能!

    之前讲了Springboot整合Mybatis,然后介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.接下来要说一说Mybatis 的分页 ...

  5. PageHelper使用方法

    PageHelper 插件的使用 一.PageHelper 介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库,例如mysql.oracle.ma ...

  6. 学成在线--17.我的课程

    文章目录 一.需求分析 二.API接口 三.PageHelper 1.PageHelper介绍 2.添加依赖 3.配置pageHelper 四.Dao 1.mapper 接口 2.mapper.xml ...

  7. Java的新项目学成在线笔记-day7(一)

    1.1需求分析 课程添加完成后可通过我的课程进入课程修改页面,此页面显示我的课程列表,如下图所示,可分页查询. 注意:由于课程图片服务器没有搭建,这里在测试时图片暂时无法显示. 上边的查询要实现分页. ...

  8. 第七章、Spring Boot MyBatis升级篇

    课时二十七.Spring Boot MyBatis升级篇-注解 缘起:在一节视频中,有这么一段留言:"会不会推出SpringBoot整合Mybaits配置文件sqlMapConfig.xml ...

  9. 商品管理系统SSM练习开发详细手册

    SSM综合练习 1.功能介绍 1.1 环境搭建 主要讲解maven工程搭建,以及基于oracle数据库的商品表信息,并完成SSM整合. 1.2 商品查询 基于SSM整合基础上完成商品查询,要掌握主面页 ...

最新文章

  1. CREATE SEQUENCE添加自增序列及NEXT VALUE FOR返回序列号
  2. ASP.NET 4学习笔记(1) SQL注入攻击及解决方案.
  3. 基础才是重中之重~用好configSections让配置信息更规范
  4. 成功解决This module was deprecated in version 0.18 in favor of the model_selection module into which all
  5. MyCat学习:使用MySQL搭建主从复制(双主双从模式)
  6. SAP Commerce Cloud portal 的 deployment
  7. [转载] 财经郎眼20120423:长点心吧“两桶油”!
  8. nand flash和nor flash区别_从闪存的发展历史看,eMMC与NAND Flash有什么区别与联系?...
  9. SAI v2.0小巧强大的板绘工具
  10. 远程教育英语和计算机难吗,网络教育英语统考难么?
  11. VBS QQ微信消息轰炸
  12. 广域网技术(PAP和CHAP)
  13. 1.Apache Flume 简介
  14. 为什么 128 KB 的魂斗罗可以实现那么长的剧情 ?
  15. MySQL--死锁的原因及解决方法
  16. 022减淡工具,加深工具与海绵工具
  17. java图片加气泡文字_图片加气泡文字
  18. xargs命令详解,xargs与管道的区别
  19. 究极聚合,效率翻倍——CSDN浏览器助手体验测评
  20. 把一个电脑上的软件发布成网页应用,C/S转B/S,RemoteApp,Rdweb

热门文章

  1. 18个接私活的平台:
  2. 程序yuan开发-windows小工具:gif截图-LICEcap、文件查找-Everything、远程软件-TeamView、视频播放-PotPlayer、markdown编辑-Typora、
  3. linux电脑支持5g吗,支持5G的全键盘掌上电脑设备Astro Slide
  4. Antd 表格 ellipsis属性兼容性问题
  5. tkinter窗口布局pack方法详解
  6. Python编程错误:参数错误([_ctypes.COMError: (-2147024809, ‘参数错误。‘, (None, None, None, 0, ...
  7. 我们的实践:事理图谱,下一代知识图谱
  8. 适应大众化教育的创客理念设计
  9. S7COMM协议分析
  10. vue项目实录:下拉刷新组件的开发及slot的使用