Spring中整合Mybatis分頁外掛PageHelper
阿新 • • 發佈:2019-01-28
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建議手動分頁
分頁外掛不支援巢狀結果對映
由於巢狀結果方式會導致結果集被摺疊,因此分頁查詢的結果在摺疊後總數會減少,所以無法保證分頁結果數量正確。