概述
如果你也在用 MyBatis,建議嘗試該分頁插件,這一定是最方便使用的分頁插件。分頁插件支持任何複雜的單表、多表分頁。我們在項目中使用sql的手動分頁太常見了,如果前臺需要分頁信息的話,一般我們是需要2條slq語句,一條是查詢總頁數count,一條是查詢分頁數據,有了PageHelper後一切方便了,並且添加的代碼很少,來一起學習吧。
官方參考文檔 :https://pagehelper.github.io
官方Github地址:https://github.com/pagehelper/Mybatis-PageHelper
1.引入分頁插件
引入分頁插件有下面2種方式,推薦使用 Maven 方式。
1). 引入 Jar 包
你可以從下面的地址中下載最新版本的 jar 包
-
https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
-
http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
由於使用了sql 解析工具,你還需要下載 jsqlparser.jar:
2). 使用 Maven(推薦)
在 pom.xml 中添加如下依賴:(最新5.1.10)
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
2. 配置攔截器插件
常見的參數配置只關注helperDialect=mysql(方言),reasonable=true(分頁合理化)就可以了,其他可使用默認。下面的配置2.1和2.2選擇其中一個配置就可以,推薦2.1中在mybatis的配置文件中配置。
2.1 在 MyBatis 配置 xml 中配置攔截器插件
<plugins>
<!-- com.github.pagehelper爲PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<property name="dialect" value="mysql" />
<!-- 該參數默認爲false -->
<!-- 設置爲true時,會將RowBounds第一個參數offset當成pageNum頁碼使用 -->
<!-- 和startPage中的pageNum效果一樣 -->
<property name="offsetAsPageNum" value="true" />
<!-- 該參數默認爲false -->
<!-- 設置爲true時,使用RowBounds分頁會進行count查詢 -->
<property name="rowBoundsWithCount" value="true" />
<!-- 設置爲true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->
<!-- (相當於沒有執行分頁查詢,但是返回結果仍然是Page類型) -->
<property name="pageSizeZero" value="true" />
<!-- 3.3.0版本可用 - 分頁參數合理化,默認false禁用 -->
<!-- 啓用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最後一頁 -->
<!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數據 -->
<property name="reasonable" value="false" />
<!-- 3.5.0版本可用 - 爲了支持startPage(Object params)方法 -->
<!-- 增加了一個`params`參數來配置參數映射,用於從Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值 -->
<!-- 不理解該含義的前提下,不要隨便複製該配置 -->
<property name="params" value="pageNum=start;pageSize=limit;" />
<!-- always總是返回PageInfo類型,check檢查返回類型是否爲PageInfo,none返回Page -->
<property name="returnPageInfo" value="check" />
</plugin>
</plugins>
2.2 在 Spring 配置文件中配置攔截器插件
使用 spring 的屬性配置方式,可以使用 plugins
屬性像下面這樣配置:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="dialect" value="mysql" />
<!-- 該參數默認爲false -->
<!-- 設置爲true時,會將RowBounds第一個參數offset當成pageNum頁碼使用 -->
<!-- 和startPage中的pageNum效果一樣 -->
<property name="offsetAsPageNum" value="true" />
<!-- 該參數默認爲false -->
<!-- 設置爲true時,使用RowBounds分頁會進行count查詢 -->
<property name="rowBoundsWithCount" value="true" />
<!-- 設置爲true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果 -->
<!-- (相當於沒有執行分頁查詢,但是返回結果仍然是Page類型) -->
<property name="pageSizeZero" value="true" />
<!-- 3.3.0版本可用 - 分頁參數合理化,默認false禁用 -->
<!-- 啓用合理化時,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最後一頁 -->
<!-- 禁用合理化時,如果pageNum<1或pageNum>pages會返回空數據 -->
<property name="reasonable" value="false" />
<!-- 3.5.0版本可用 - 爲了支持startPage(Object params)方法 -->
<!-- 增加了一個`params`參數來配置參數映射,用於從Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值 -->
<!-- 不理解該含義的前提下,不要隨便複製該配置 -->
<property name="params" value="pageNum=start;pageSize=limit;" />
<!-- always總是返回PageInfo類型,check檢查返回類型是否爲PageInfo,none返回Page -->
<property name="returnPageInfo" value="check" />
</bean>
</array>
</property>
</bean>
3. 如何在代碼中使用
官方推薦用法:PageHelper.startPage
靜態方法調用
其實用法很簡單就是在正常查詢方法上添加一句話:
PageHelper.startPage(1, 10);// 參數:page, size
List<Country> list = countryMapper.selectIf(1);// 正常查詢的方法
如果需要更詳細的分頁信息的話:如總頁數,當前頁,是否首頁,是否尾頁,等等...只需要用PageInfo將查詢列表包裝起來,前臺可以使用pageInfo來處理前端的分頁插件 。
//獲取第1頁,10條內容,默認查詢總數count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo對結果進行包裝
PageInfo pageInfo = new PageInfo(list);
以下是PageInfo的屬性,可參考:
//當前頁
private int pageNum;
//每頁的數量
private int pageSize;
//當前頁的數量
private int size;
//由於startRow和endRow不常用,這裏說個具體的用法
//可以在頁面中"顯示startRow到endRow 共size條數據"
//當前頁面第一個元素在數據庫中的行號
private int startRow;
//當前頁面最後一個元素在數據庫中的行號
private int endRow;
//總記錄數
private long total;
//總頁數
private int pages;
//結果集
private List < T > list;
//前一頁
private int prePage;
//下一頁
private int nextPage;
//是否爲第一頁
private boolean isFirstPage = false;
//是否爲最後一頁
private boolean isLastPage = false;
//是否有前一頁
private boolean hasPreviousPage = false;
//是否有下一頁
private boolean hasNextPage = false;
//導航頁碼數
private int navigatePages;
//所有導航頁號
private int[] navigatepageNums;
//導航條上的第一頁
private int navigateFirstPage;
//導航條上的最後一頁
private int navigateLastPage;
重要提示
PageHelper.startPage
方法重要提示
只有緊跟在PageHelper.startPage
方法後的第一個Mybatis的查詢(Select)方法會被分頁。
請不要配置多個分頁插件
請不要在系統中配置多個分頁插件(使用Spring時,mybatis-config.xml
和Spring<bean>
配置方式,請選擇其中一種,不要同時配置多個分頁插件)!
分頁插件不支持帶有for update
語句的分頁
對於帶有for update
的sql,會拋出運行時異常,對於這樣的sql建議手動分頁,畢竟這樣的sql需要重視。
分頁插件不支持嵌套結果映射
由於嵌套結果方式會導致結果集被摺疊,因此分頁查詢的結果在摺疊後總數會減少,所以無法保證分頁結果數量正確。
4. MyBatis 和 Spring 集成示例
集成可參考:https://github.com/abel533/Mybatis-Spring
(完)