1. 程式人生 > >mybatis + PageHelper 實現分頁

mybatis + PageHelper 實現分頁

如果你也在使用Mybatis,建議嘗試PageHelper外掛,這個一定是最方便使用的分頁外掛。
該外掛目前支援Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六種資料庫分頁。
PageHelper分頁外掛專案中的正式程式碼一共有個5個Java檔案,這5個檔案的說明如下:

 

       1:  Page<E>[必須]:分頁引數類,該類繼承ArrayList,雖然分頁查詢返回的結果實際型別是Page<E>,但是可以完全不出現所有的程式碼中,可以直接當成List使用。返回值不建議使用Page,建議仍然用List。如果需要用到分頁資訊,使用下面的PageInfo類對List進行包裝即可。

       2:  PageHelper[必須]:分頁外掛攔截器類,對Mybatis的攔截在這個類中實現。

       3:  PageInfo[可選]:Page<E>的包裝類,包含了全面的分頁屬性資訊。

      4: SqlParser[可選]:提供高效的count查詢sql。主要是智慧替換原sql語句為count(*),去除不帶引數的order by語句。需要jsqlparser-0.9.1.jar支援。

       5: SqlUtil[必須]:分頁外掛工具類,分頁外掛邏輯類,分頁外掛的主要實現方法都在這個類中

使用maven

新增如下依賴:

<dependency>

    <groupId>com.github.pagehelper</groupId>

    <artifactId>pagehelper</artifactId>

    <version>3.4.2</version>

</dependency>

<dependency>

    <groupId>com.github.jsqlparser</groupId>

    <artifactId>jsqlparser</artifactId>

    <version>0.9.1</version>

</dependency>


在Mybatis配置xml中配置攔截器外掛:

<!--

    plugins在配置檔案中的位置必須符合要求,否則會報錯,順序如下:

    properties?, settings?,

    typeAliases?, typeHandlers?,

    objectFactory?,objectWrapperFactory?,

    plugins?,

    environments?, databaseIdProvider?, mappers?

-->

<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="true"/>

    </plugin>

</plugins>

 

 

其他五個引數說明:

    1. 增加dialect屬性,使用時必須指定該屬性,可選值為oracle,mysql,mariadb,sqlite,hsqldb,postgresql,沒有預設值,必須指定該屬性

    2. 增加offsetAsPageNum屬性,預設值為false,使用預設值時不需要增加該配置,需要設為true時,需要配置該引數。當該引數設定為true時,使用RowBounds分頁時,會將offset引數當成pageNum使用,可以用頁碼和頁面大小兩個引數進行分頁。

    3. 增加rowBoundsWithCount屬性,預設值為false,使用預設值時不需要增加該配置,需要設為true時,需要配置該引數。當該引數設定為true時,使用RowBounds分頁會進行count查詢。

    4. 增加pageSizeZero屬性,預設值為false,使用預設值時不需要增加該配置,需要設為true時,需要配置該引數。當該引數設定為true時,如果pageSize=0或者RowBounds.limit = 0就會查詢出全部的結果(相當於沒有執行分頁查詢,但是返回結果仍然是Page型別)。

    5. 增加reasonable屬性,預設值為false,使用預設值時不需要增加該配置,需要設為true時,需要配置該引數。具體作用請看上面配置檔案中的註釋內容。

 

MyBatis框架

 

           MyBatis是一個優秀的持久層框架,它對jdbc的操作資料庫的過程進行了封裝,使開發者只需要關注SQL本身,而不需要花費精力去處理例如驅動,建立connection,建立statement,手動設定引數,結果集檢索等jdbc繁雜的過程程式碼

            Mybatis通過xml或註解的方式要執行statement配置起來,並通過java物件和statement中的sql進行對映生成最終執行的sql語句,最後由mybatis框架執行sql並將結果對映成java物件並返回。

 

            這就是mybatis執行情況,那麼mybatis的外掛作用在哪一環節呢?它主要作用在Executor執行器與mappedeStatement之間,也就是說mybatis可以在外掛中獲得要執行的sql語句,在sql語句中新增limit語句,然後再去對sql進行封裝,從而可以實現分頁處理。

 

配置外掛:

現在開始在mybatis的全域性配置檔案SqlMapConfig.xml中配置外掛

 

引用配置

 

在sql查詢語句之前新增一行程式碼:

        PageHelper.startPage(page, rows); 

            page為顯示第幾頁,rows為一頁顯示多少條資料。

                            就可以查詢分頁資訊。

舉個栗子:

 

 

PageHelper.startPage(page, rows); 是一個靜態的方法,在PageHelper原始碼:

 

歡迎關注公眾號