04.MyBatis的PageHelper分頁插件

MyBatis框架提供的PageHelper分頁插件的使用

PageHelper是國內(nèi)非常優(yōu)秀的一款開源的mybatis分頁插件,支持主流與常用的數(shù)據(jù)庫,MySQL、 Oracle、 mariaDB、 DB2、 SQLte、 Hsqldb等
github地址 https://github.com/pagehelper/Mybatis-PageHelper

一. 使用方式介紹

  1. jar包導入方式【了解】

    1. https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
    2. http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
    3. jsqlparser.jar --- sql 解析工具http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/0.9.5/
  2. maven坐標【推薦】

二、maven使用方式

1). 在pom.xml中添加依賴

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
</dependency>

2). 配置攔截器

MyBatis插件的實現(xiàn)方式是使用的攔截器的原理;新版的攔截器是 com.github.pagehelper.PageInterceptor;而 com.github.pagehelper.PageHelper 現(xiàn)在是一個特殊的 dialect,是分頁插件的默認實現(xiàn)類,提供了以前相同的用法。

  1. 在Spring配置文件中配置攔截器插件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <!-- 傳入PageHelper的插件,用于分頁 -->
    <property name="plugins">
        <array>
            <!-- 傳入插件的對象 -->
            <bean class="com.github.pagehelper.PageInterceptor">
                <property name="properties">
                    <props>
                        <prop key="helperDialect">oracle</prop>
                        <prop key="reasonable">true</prop>
                    </props>
                </property>

                <-- 或者使用其他方式,替換上面對應(yīng)的標簽體-->
            </bean>
        </array>
    </property>
</bean>
  1. 補充寫法
<property name="properties">
    <!--使用下面的方式配置參數(shù),一行配置一個 -->
    <value>
        helperDialect=oracle
    </value>
</property>

3). 使用PageHelper.startPage 靜態(tài)方法調(diào)用

在進行分頁的MyBatis查詢方法前調(diào)用PageHelper.startPage靜態(tài)方法即可,緊跟 在這個方法后的 第一個MyBatis查詢相關(guān)方法 會被進行分頁。

底層的運行原理大致解析:與LocalThread本地線程類變量有關(guān),當調(diào)用此靜態(tài)方法之后,拼接的連接器激活,再次操作與MyBatis相關(guān)的方法后會進行分頁語句SQL拼接,然后去數(shù)據(jù)庫查詢!并且拼接完后,激活狀態(tài)失活!

  1. service層中設(shè)置分頁查詢
// 獲取第1頁,10條內(nèi)容,默認查詢總數(shù)count
PageHelper.startPage(1, 10);

// 緊跟著的第一個select方法會被分頁
List<Country> list = countryMapper.selectIf(1);
  1. Controller中可以創(chuàng)建PageInfo封裝全面的的分頁信息
// 封裝的相關(guān)分頁信息
PageInfo pageInfo = new PageInfo(list);

三、補充知識介紹

1). 分頁插件參數(shù)介紹【關(guān)注前兩個即可】

  1. helperDialect】: 指定數(shù)據(jù)庫,一般不用配置,底層會自動識別
    • 指定時的參數(shù)值:oracle , mysql , mariadb , sqlite , hsqldb , postgresql , db2 , sqlserver , informix , h2 , sqlserver2012 , derby
    • 使用 SqlServer2012 數(shù)據(jù)庫時,需要手動指定為 sqlserver2012 ,否則會使用 SqlServer2005 的方式進行分頁。

也可以實現(xiàn) AbstractHelperDialect ,然后配置該屬性為實現(xiàn)類的全限定名稱即可使用自定義的實現(xiàn)方法。

  1. reasonable】: 分頁合理化參數(shù),默認值為 false 。當該參數(shù)設(shè)置為 true 時, pageNum<=0 時會查詢第一頁, pageNum>pages (超過總數(shù)時),會查詢最后一頁。默認 false 時,直接根據(jù)參數(shù)進行查詢。

  2. offsetAsPageNum: 默認值為 false ,該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當該參數(shù)設(shè)置為true 時,會將 RowBounds 中的 offset 參數(shù)當成 pageNum 使用,可以用頁碼和頁面大小兩個參數(shù)進行分頁。

  3. rowBoundsWithCount**: 該參數(shù)對使用 RowBounds 作為分頁參數(shù)時有效。 當該參數(shù)設(shè)置為 true 時,使用 RowBounds 分頁會進行 count 查詢。

  4. pageSizeZero: 默認值為 false ,當該參數(shù)設(shè)置為 true 時,如果 pageSize=0 或者 RowBounds.limit =0 就會查詢出全部的結(jié)果(相當于沒有執(zhí)行分頁查詢,但是返回結(jié)果仍然是 Page 類型)。

  5. params: 為了支持 startPage(Object params) 方法,增加了該參數(shù)來配置參數(shù)映射,用于從對象中根據(jù)屬性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable ,不配置映射的用默認值, 默認值為 pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

  6. supportMethodsArguments: 支持通過 Mapper 接口參數(shù)來傳遞分頁參數(shù),默認值 false ,分頁插件會從查詢方法的參數(shù)值中,自動根據(jù)上面 params 配置的字段中取值,查找到合適的值時就會自動分頁。 使用方法可以參考測試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTestArgumentsObjTest

  7. autoRuntimeDialect: 默認值為 false 。設(shè)置為 true 時,允許在運行時根據(jù)多數(shù)據(jù)源自動識別對應(yīng)方言的分頁 (不支持自動選擇 sqlserver2012 ,只能使用 sqlserver )

  8. closeConn: 默認值為 true 。當使用運行時動態(tài)數(shù)據(jù)源或沒有設(shè)置 helperDialect 屬性自動獲取數(shù)據(jù)庫類型時,會自動獲取一個數(shù)據(jù)庫連接, 通過該屬性來設(shè)置是否關(guān)閉獲取的這個連接,默認 true 關(guān)閉,設(shè)置為false 后,不會關(guān)閉獲取的連接,這個參數(shù)的設(shè)置要根據(jù)自己選擇的數(shù)據(jù)源來決定。

2). MyBatis配置xml文件中配置攔截器插件

<!-----------------------------------------------
plugins在配置文件中的位置必須符合要求,否則會報錯,順序如下:
    properties?,
    settings?,
    typeAliases?,
    typeHandlers?,
    objectFactory?,
    objectWrapperFactory?,
    plugins?,
    environments?,
    databaseIdProvider?,
    mappers?
--------------------------------------------------->
<plugins>
    <!-- com.github.pagehelper為PageHelper類所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用下面的方式配置參數(shù),后面會有所有的參數(shù)介紹 -->
        <property name="param1" value="value1"/>
    </plugin>
</plugins>

3). RowBounds方式的調(diào)用

PageHelper的基本使用有6種

1. 使用命名空間方式調(diào)用RowBounds

List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(1, 10));

可以使用RowBounds參數(shù)進行分頁,這種方式侵入性最小,我們可以看到,通過RowBounds方式調(diào)用只是使用了這個參數(shù),并沒有增加其他任何內(nèi)容。分頁插件檢測到使用了RowBounds參數(shù)時,就會對該查詢進行物理分頁。關(guān)于這種方式的調(diào)用,有兩個特殊的參數(shù)是針對 RowBounds 的,可以參看上面的分頁插件參數(shù)介紹

2. 直接在Dao接口中加入RowBounds參數(shù)簽名

//這種情況下也會進行物理分頁查詢
List<Country> selectAll(RowBounds rowBounds);

由于默認情況下的 RowBounds 無法獲取查詢總數(shù),分頁插件提供了一個繼承自 RowBounds 的PageRowBounds ,這個對象中增加了 total 屬性,執(zhí)行分頁查詢后,可以從該屬性得到查詢總數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容