1. 程式人生 > >Spring中整合Mybatis分頁外掛PageHelper

Spring中整合Mybatis分頁外掛PageHelper

1. 使用Maven方式引入分頁外掛

  • 在pom.xml中新增如下依賴:
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.0.0</version>
</dependency>

2. 配置攔截器外掛

  • 在Spring配置檔案中配置
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
>
<property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" /> <property name="mapperLocations"> <list> <value>classpath:mybatis/mapper/*Mapper.xml</value> </list
>
</property> <!-- 注意其他配置 --> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <!--使用下面的方式配置引數,一行配置一個 --> <value>
helperDialect=mysql reasonable=true supportMethodsArguments=true params=count=countSql autoRuntimeDialect=true </value> </property> </bean> </array> </property> </bean>

注意新版本的變化

  • 攔截器com.github.pagehelper.PageInterceptor
  • 原來的dialect變成了helperDialect

分頁外掛中使用到的引數說明

  • helperDialect:分頁外掛會自動檢測當前的資料庫連結,自動選擇合適的分頁方式。
    你可以配置helperDialect屬性來指定分頁外掛使用哪種方言。配置時,可以使用下面的縮寫值:
    oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
    特別注意:使用 SqlServer2012 資料庫時,需要手動指定為 sqlserver2012,否則會使用 SqlServer2005 的方式進行分頁。
    你也可以實現 AbstractHelperDialect,然後配置該屬性為實現類的全限定名稱即可使用自定義的實現方法。
  • reasonable:分頁合理化引數,預設值為false。當該引數設定為 true 時,pageNum<=0 時會查詢第一頁,
    pageNum>pages(超過總數時),會查詢最後一頁。預設false 時,直接根據引數進行查詢。
  • params:為了支援startPage(Object params)方法,增加了該引數來配置引數對映,用於從物件中根據屬性名取值,
    可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置對映的用預設值,
    預設值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero
  • supportMethodsArguments:支援通過 Mapper 介面引數來傳遞分頁引數,預設值false,分頁外掛會從查詢方法的引數值中,自動根據上面 params 配置的欄位中取值,查詢到合適的值時就會自動分頁。
  • autoRuntimeDialect:預設值為 false。設定為 true 時,允許在執行時根據多資料來源自動識別對應方言的分頁
    (不支援自動選擇sqlserver2012,只能使用sqlserver
  • pageSizeZero:預設值為 false,當該引數設定為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結果(相當於沒有執行分頁查詢,但是返回結果仍然是 Page 型別)。

3. 程式碼中使用

  • 使用Mapper介面方式呼叫
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
  • 在需要進行分頁的MyBatis查詢方法前呼叫PageHelper.startPage靜態方法即可,緊跟在這個方法後的第一個Mybatis查詢方法會被分頁。
  • 例一:
//獲取第1頁,10條內容,預設查詢總數count
PageHelper.startPage(1, 10);
//緊跟著的第一個select方法會被分頁
List<Country> list = countryMapper.selectIf(1);
assertEquals(2, list.get(0).getId());
assertEquals(10, list.size());
//分頁時,實際返回的結果list型別是Page<E>,如果想取出分頁資訊,需要強制轉換為Page<E>
assertEquals(182, ((Page) list).getTotal());
  • 例二:
//request: url?pageNum=1&pageSize=10
//支援 ServletRequest,Map,POJO 物件,需要配合 params 引數
PageHelper.startPage(request);
//緊跟著的第一個select方法會被分頁
List<Country> list = countryMapper.selectIf(1);

//後面的不會被分頁,除非再次呼叫PageHelper.startPage
List<Country> list2 = countryMapper.selectIf(null);
//list1
assertEquals(2, list.get(0).getId());
assertEquals(10, list.size());
//分頁時,實際返回的結果list型別是Page<E>,如果想取出分頁資訊,需要強制轉換為Page<E>,
//或者使用PageInfo類(下面的例子有介紹)
assertEquals(182, ((Page) list).getTotal());
//list2
assertEquals(1, list2.get(0).getId());
assertEquals(182, list2.size());
  • 例三:
//獲取第1頁,10條內容,預設查詢總數count
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectAll();
//用PageInfo對結果進行包裝
PageInfo page = new PageInfo(list);
//測試PageInfo全部屬性
//PageInfo包含了非常全面的分頁屬性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());

重要提示

PageHelper.startPage方法重要提示

只有緊跟在PageHelper.startPage方法後的第一個*Mybatis的查詢Select*方法會被分頁。

請不要配置多個分頁外掛

  • 使用Spring時,配置檔案中配置一種方式
  • 第一種:在mybatis配置檔案中配置mybatis-config.xml
  • 第二種:在spring的配置檔案中配置Spring<bean> spring.xml

分頁外掛不支援帶有for update語句的分頁

對於帶有for update的sql,會丟擲執行時異常,對於這樣的sql建議手動分頁

分頁外掛不支援巢狀結果對映

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