Mybatis PageHelper(MyBatis 分頁插件 )的使用

概述

如果你也在用 MyBatis,建議嘗試該分頁插件,這一定是最方便使用的分頁插件。分頁插件支持任何複雜的單表、多表分頁。我們在項目中使用sql的手動分頁太常見了,如果前臺需要分頁信息的話,一般我們是需要2條slq語句,一條是查詢總頁數count,一條是查詢分頁數據,有了PageHelper後一切方便了,並且添加的代碼很少,來一起學習吧。

官方參考文檔 :https://pagehelper.github.io

官方Github地址:https://github.com/pagehelper/Mybatis-PageHelper

1.引入分頁插件

引入分頁插件有下面2種方式,推薦使用 Maven 方式。

1). 引入 Jar 包

你可以從下面的地址中下載最新版本的 jar 包

由於使用了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.xmlSpring<bean>配置方式,請選擇其中一種,不要同時配置多個分頁插件)!

分頁插件不支持帶有for update語句的分頁

對於帶有for update的sql,會拋出運行時異常,對於這樣的sql建議手動分頁,畢竟這樣的sql需要重視。

分頁插件不支持嵌套結果映射

由於嵌套結果方式會導致結果集被摺疊,因此分頁查詢的結果在摺疊後總數會減少,所以無法保證分頁結果數量正確。

4. MyBatis 和 Spring 集成示例

集成可參考:https://github.com/abel533/Mybatis-Spring

(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章