Mybatis的插件 PageHelper 分頁查詢使用方法

Mybatis的一個插件,PageHelper,很是方便mybatis分頁查詢。國內牛人的一個開源項目,有興趣的能夠去看源碼,都有中文註釋(ps:某些源碼一大堆英文,聲淚俱下!)html

在github上倉庫地址爲:Mybatis-PageHelperjava

它支持基本主流與經常使用的數據庫,這能夠在它的文檔上看到。這裏記錄一下使用的基本方法git


0.查看文檔與使用準備

開發文檔有中文文檔也有英文文檔github


PageHelper官方文檔spring


============================================
數據庫



====================================================================================
bootstrap





1.配置攔截器插件


這個是配置在mybatis-config.xml文件中mybatis

文檔中的示例:app

  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>  

個人配置:
ide

  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 = "pageNum")Integer pageNum,  
  3.                    Map<String,Object> map){  
  4.   
  5.     //引入分頁查詢,使用PageHelper分頁功能  
  6.     //在查詢以前傳入當前頁,而後多少記錄  
  7.     PageHelper.startPage(pageNum,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. }  

以上使用說明:

·在查詢調用方法前聲明分頁信息(當前頁,每頁記錄數)

·在查詢調用方法對查詢結果進行包裝成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.   
  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. }  

這裏只列出全部屬性和構造方法,那麼能夠清晰的看到一些屬性的含義,一些屬性是如何初始化,而且初始化值是怎樣的,更多詳細狀況能夠本身去查看源碼,都有中文註釋


那麼能夠很方便在頁面進行值的獲取輸出


4.在頁面獲取值(實現分頁)

  1. <!--經過bootstrap的柵格系統佈局-->  
  2. <div class="container">  
  3.   
  4.     <!--標題-->  
  5.     <div class="row">  
  6.         <div class="col-md-12">  
  7.             <h1>SSM-CRUD</h1>  
  8.         </div>  
  9.   
  10.     </div>  
  11.   
  12.     <!--按鈕-->  
  13.     <div class="row">  
  14.         <div class="col-md-4 col-md-offset-8">  
  15.             <button class="btn btn-primary">新增</button>  
  16.             <button class="btn btn-danger">刪除</button>  
  17.         </div>  
  18.     </div>  
  19.   
  20.     <!--顯示錶格數據-->  
  21.     <div class="row">  
  22.         <div class="col-md-12">  
  23.             <table class="table table-hover">  
  24.                 <tr>  
  25.                     <th>#</th>  
  26.                     <th>empName</th>  
  27.                     <th>gender</th>  
  28.                     <th>email</th>  
  29.                     <th>deptName</th>  
  30.                     <th>操做</th>  
  31.                 </tr>  
  32.   
  33.   
  34.                 <c:forEach items="${pageInfo.list}" var="emp">  
  35.                     <tr>  
  36.                         <th>${emp.empId}</th>  
  37.                         <th>${emp.empName}</th>  
  38.                         <th>${emp.gender=="M"?"男":"女" }</th>  
  39.                         <th>${emp.email}</th>  
  40.                         <th>${emp.department.deptName}</th>  
  41.                         <th>  
  42.                             <button class="btn btn-primary">  
  43.                                 <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>  
  44.                                 編輯  
  45.                             </button>  
  46.   
  47.                             <button class="btn btn-danger">  
  48.                                 <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>  
  49.                                 刪除  
  50.                             </button>  
  51.   
  52.                         </th>  
  53.                     </tr>  
  54.                 </c:forEach>  
  55.   
  56.             </table>  
  57.         </div>  
  58.   
  59.     </div>  
  60.   
  61.     <!--顯示分頁信息-->  
  62.     <div class="row">  
  63.         <!--文字信息-->  
  64.         <div class="col-md-6">  
  65.             當前第 ${pageInfo.pageNum} 頁.總共 ${pageInfo.pages} 頁.一共 ${pageInfo.total} 條記錄  
  66.         </div>  
  67.   
  68.         <!--點擊分頁-->  
  69.         <div class="col-md-6">  
  70.             <nav aria-label="Page navigation">  
  71.                 <ul class="pagination">  
  72.                       
  73.                     <li><a href="${pageContext.request.contextPath}/emps?pn=1">首頁</a></li>  
  74.                       
  75.                     <!--上一頁-->  
  76.                     <li>  
  77.                         <c:if test="${pageInfo.hasPreviousPage}">  
  78.                             <a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pageNum-1}" aria-label="Previous">  
  79.                                 <span aria-hidden="true">«</span>  
  80.                             </a>  
  81.                         </c:if>  
  82.                     </li>  
  83.   
  84.                     <!--循環遍歷連續顯示的頁面,如果當前頁就高亮顯示,而且沒有連接-->  
  85.                     <c:forEach items="${pageInfo.navigatepageNums}" var="page_num">  
  86.                         <c:if test="${page_num == pageInfo.pageNum}">  
  87.                             <li class="active"><a href="#">${page_num}</a></li>  
  88.                         </c:if>  
  89.                         <c:if test="${page_num != pageInfo.pageNum}">  
  90.                             <li><a href="${pageContext.request.contextPath}/emps?pn=${page_num}">${page_num}</a></li>  
  91.                         </c:if>  
  92.                     </c:forEach>  
  93.   
  94.                     <!--下一頁-->  
  95.                     <li>  
  96.                         <c:if test="${pageInfo.hasNextPage}">  
  97.                             <a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pageNum+1}"  
  98.                                aria-label="Next">  
  99.                                 <span aria-hidden="true">»</span>  
  100.                             </a>  
  101.                         </c:if>  
  102.                     </li>  
  103.                       
  104.                     <li><a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pages}">尾頁</a></li>  
  105.                 </ul>  
  106.             </nav>  
  107.         </div>  
  108.   
  109.     </div>  
  110.   
  111.   
  112. </div>  

最後顯示:



以上很常見的分頁需求,能夠很是方便的使用。
而且支持各類數據庫,能夠有多種方式進行引入插件,對於springBoot也有很是好的整合使用。

PageHelpe開源地址

github項目地址:https://github.com/pagehelper/Mybatis-PageHelper 碼雲 項目地址:http://git.oschina.net/free/Mybatis_PageHelper

相關文章
相關標籤/搜索