• Mybatis的插件 PageHelper 分页查询使用方法


    Mybatis的一个插件,PageHelper,非常方便mybatis分页查询。国内牛人的一个开源项目,有兴趣的可以去看源码,都有中文注释(ps:某些源码一大堆英文,痛哭流涕!)

    在github上仓库地址为:Mybatis-PageHelper

    它支持基本主流与常用的数据库,这可以在它的文档上看到。这里记录一下使用的基本方法


    0.查看文档与使用准备

    开发文档有中文文档也有英文文档


    PageHelper官方文档


    ============================================



    ====================================================================================





    1.配置拦截器插件


    这个是配置在mybatis-config.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.PageInterceptor">
    12. <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
    13. <property name="param1" value="value1"/>
    14. </plugin>
    15. </plugins>

    我的配置:

    1. <plugins>
    2. <plugin interceptor="com.github.pagehelper.PageInterceptor">
    3. <!-- config params as the following -->
    4. <!--<!–分页参数合理化 –>-->
    5. <property name="reasonable" value="true"/>
    6. </plugin>
    7. </plugins>

    一些配置参数的说明可以参考文档: 【分页插件参数介绍】

    这里就说明一下reasonable的配置:

    reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。


    那么如何选择这些配置参数,文档中也给出了详细说明:【如何选择配置这些参数】


    2.在代码中使用

    官方文档也有这部分说明和案例,那么我就以自己的使用案例

    1. @RequestMapping("/emps")
    2. public String list(@RequestParam(required = false,defaultValue = "1",value = "pn")Integer pn,
    3. Map<String,Object> map){
    4. //引入分页查询,使用PageHelper分页功能
    5. //在查询之前传入当前页,然后多少记录
    6. PageHelper.startPage(pn,5);
    7. //startPage后紧跟的这个查询就是分页查询
    8. List<Employee> emps = employeeService.getAll();
    9. //使用PageInfo包装查询结果,只需要将pageInfo交给页面就可以
    10. PageInfo pageInfo = new PageInfo<>(emps,5);
    11. //pageINfo封装了分页的详细信息,也可以指定连续显示的页数
    12. map.put("pageInfo",pageInfo);
    13. return "list";
    14. }

    以上使用说明:

    ·在查询调用方法前声明分页信息(当前页,每页记录数)

    ·在查询调用方法对查询结果进行包装成PageInfo对象,也可以是定连续显示的页数,这也是常用功能。

    注意:都是与查询方法紧挨着的,不要中间夹杂其它无关语句


    之后把信息放在ModelAndView中就可以在前台访问了。


    下面说一下为什么要把查询结果包装成PageInfo对象


    3.PageInfo类说明


    类源码(更多源码去github上查看即可):

    1. public class PageInfo<T> implements Serializable {
    2. private static final long serialVersionUID = 1L;
    3. //当前页
    4. private int pageNum;
    5. //每页的数量
    6. private int pageSize;
    7. //当前页的数量
    8. private int size;
    9. //由于startRow和endRow不常用,这里说个具体的用法
    10. //可以在页面中"显示startRow到endRow 共size条数据"
    11. //当前页面第一个元素在数据库中的行号
    12. private int startRow;
    13. //当前页面最后一个元素在数据库中的行号
    14. private int endRow;
    15. //总记录数
    16. private long total;
    17. //总页数
    18. private int pages;
    19. //结果集
    20. private List<T> list;
    21. //前一页
    22. private int prePage;
    23. //下一页
    24. private int nextPage;
    25. //是否为第一页
    26. private boolean isFirstPage = false;
    27. //是否为最后一页
    28. private boolean isLastPage = false;
    29. //是否有前一页
    30. private boolean hasPreviousPage = false;
    31. //是否有下一页
    32. private boolean hasNextPage = false;
    33. //导航页码数
    34. private int navigatePages;
    35. //所有导航页号
    36. private int[] navigatepageNums;
    37. //导航条上的第一页
    38. private int navigateFirstPage;
    39. //导航条上的最后一页
    40. private int navigateLastPage;
    41. public PageInfo() {
    42. }
    43. /**
    44. * 包装Page对象
    45. *
    46. * @param list
    47. */
    48. public PageInfo(List<T> list) {
    49. this(list, 8);
    50. }
    51. /**
    52. * 包装Page对象
    53. *
    54. * @param list page结果
    55. * @param navigatePages 页码数量
    56. */
    57. public PageInfo(List<T> list, int navigatePages) {
    58. if (list instanceof Page) {
    59. Page page = (Page) list;
    60. this.pageNum = page.getPageNum();
    61. this.pageSize = page.getPageSize();
    62. this.pages = page.getPages();
    63. this.list = page;
    64. this.size = page.size();
    65. this.total = page.getTotal();
    66. //由于结果是>startRow的,所以实际的需要+1
    67. if (this.size == 0) {
    68. this.startRow = 0;
    69. this.endRow = 0;
    70. } else {
    71. this.startRow = page.getStartRow() + 1;
    72. //计算实际的endRow(最后一页的时候特殊)
    73. this.endRow = this.startRow - 1 + this.size;
    74. }
    75. } else if (list instanceof Collection) {
    76. this.pageNum = 1;
    77. this.pageSize = list.size();
    78. this.pages = this.pageSize > 0 ? 1 : 0;
    79. this.list = list;
    80. this.size = list.size();
    81. this.total = list.size();
    82. this.startRow = 0;
    83. this.endRow = list.size() > 0 ? list.size() - 1 : 0;
    84. }
    85. if (list instanceof Collection) {
    86. this.navigatePages = navigatePages;
    87. //计算导航页
    88. calcNavigatepageNums();
    89. //计算前后页,第一页,最后一页
    90. calcPage();
    91. //判断页面边界
    92. judgePageBoudary();
    93. }
    94. }
    95. .......
    96. }

    这里只列出所有属性和构造方法,那么可以清晰的看到一些属性的含义,一些属性是如何初始化,并且初始化值是怎样的,更多详细情况可以自己去查看源码,都有中文注释


    那么可以很方便在页面进行值的获取输出


    4.在页面获取值(实现分页)

    1. <!--通过bootstrap的栅格系统布局-->
    2. <div class="container">
    3. <!--标题-->
    4. <div class="row">
    5. <div class="col-md-12">
    6. <h1>SSM-CRUD</h1>
    7. </div>
    8. </div>
    9. <!--按钮-->
    10. <div class="row">
    11. <div class="col-md-4 col-md-offset-8">
    12. <button class="btn btn-primary">新增</button>
    13. <button class="btn btn-danger">删除</button>
    14. </div>
    15. </div>
    16. <!--显示表格数据-->
    17. <div class="row">
    18. <div class="col-md-12">
    19. <table class="table table-hover">
    20. <tr>
    21. <th>#</th>
    22. <th>empName</th>
    23. <th>gender</th>
    24. <th>email</th>
    25. <th>deptName</th>
    26. <th>操作</th>
    27. </tr>
    28. <c:forEach items="${pageInfo.list}" var="emp">
    29. <tr>
    30. <th>${emp.empId}</th>
    31. <th>${emp.empName}</th>
    32. <th>${emp.gender=="M"?"男":"女" }</th>
    33. <th>${emp.email}</th>
    34. <th>${emp.department.deptName}</th>
    35. <th>
    36. <button class="btn btn-primary">
    37. <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
    38. 编辑
    39. </button>
    40. <button class="btn btn-danger">
    41. <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
    42. 删除
    43. </button>
    44. </th>
    45. </tr>
    46. </c:forEach>
    47. </table>
    48. </div>
    49. </div>
    50. <!--显示分页信息-->
    51. <div class="row">
    52. <!--文字信息-->
    53. <div class="col-md-6">
    54. 当前第 ${pageInfo.pageNum} 页.总共 ${pageInfo.pages} 页.一共 ${pageInfo.total} 条记录
    55. </div>
    56. <!--点击分页-->
    57. <div class="col-md-6">
    58. <nav aria-label="Page navigation">
    59. <ul class="pagination">
    60. <li><a href="${pageContext.request.contextPath}/emps?pn=1">首页</a></li>
    61. <!--上一页-->
    62. <li>
    63. <c:if test="${pageInfo.hasPreviousPage}">
    64. <a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pageNum-1}" aria-label="Previous">
    65. <span aria-hidden="true">«</span>
    66. </a>
    67. </c:if>
    68. </li>
    69. <!--循环遍历连续显示的页面,若是当前页就高亮显示,并且没有链接-->
    70. <c:forEach items="${pageInfo.navigatepageNums}" var="page_num">
    71. <c:if test="${page_num == pageInfo.pageNum}">
    72. <li class="active"><a href="#">${page_num}</a></li>
    73. </c:if>
    74. <c:if test="${page_num != pageInfo.pageNum}">
    75. <li><a href="${pageContext.request.contextPath}/emps?pn=${page_num}">${page_num}</a></li>
    76. </c:if>
    77. </c:forEach>
    78. <!--下一页-->
    79. <li>
    80. <c:if test="${pageInfo.hasNextPage}">
    81. <a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pageNum+1}"
    82. aria-label="Next">
    83. <span aria-hidden="true">»</span>
    84. </a>
    85. </c:if>
    86. </li>
    87. <li><a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pages}">尾页</a></li>
    88. </ul>
    89. </nav>
    90. </div>
    91. </div>
    92. </div>

    最后显示:



    以上很常见的分页需求,可以非常方便的使用。
    并且支持各种数据库,可以有多种方式进行引入插件,对于springBoot也有非常好的整合使用。

    PageHelpe开源地址


    github项目地址:https://github.com/pagehelper/Mybatis-PageHelper
    码云 项目地址:http://git.oschina.net/free/Mybatis_PageHelper










    
    
    
    
    
              
  • 相关阅读:
    kvm初体验之四:从Host登录Guest的五种方式
    kvm初体验之三:vm的安装及管理
    CentOS Wifi Connection
    kvm初体验之二:安装
    kvm初体验之一:参考文档
    有6种不同颜色的球,每种球有无数个。现在取5个球,求取出5、4、3、2种不同颜色球的概率分别为多少
    求两个字符串的最长连续子串
    不用除法来实现整数的除法运算
    抽象类和接口的区别
    o(n)的时间复杂判断回文数
  • 原文地址:https://www.cnblogs.com/ZhangZiYangDeBoKe/p/10909943.html
Copyright © 2020-2023  润新知