mybatis-pageHelper 分页插件

PageHelpe开源地址

github项目地址:https://github.com/pagehelper/Mybatis-PageHelper

github上面有中文文档,里面有如何使用

pageHelper是mybatis特别好用的一个分页插件,我们要考虑传入页码pageNum和页大小pageSize作为参数,当aop进行分页时,limit通过aop自动加载到sql中

下面是我在controller中传入的参数,并且如果不传,给参数设置了默认值



1.配置拦截器插件

这个是配置在mybatis-config.xml文件中

文档中的示例:

[java]  view plain  copy
  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>  

reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。更多分页插件参数介绍以及使用场景在github中文文档中有

2.在代码中使用

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

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

3.PageInfo类说明


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

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

这里只列出所有属性和构造方法,更多详细情况可以自己去查看源码,都有中文注释





猜你喜欢

转载自blog.csdn.net/weixin_38118016/article/details/80070982