兩個都用於分頁,常用的應該是PageHelper了,理解了一下源碼后發現IPage比PageHelper好用。
使用方法是 PageHelper.startPage()然后后邊寫sql就可以。 緊接着的一個sql起作用。
IPage則需要在dao層傳入IPage的實現類Page對象,該對象實現了IPage。
區別:
PageHelper內部原理是將傳入的頁碼和條數賦值給了Page對象,保存到了一個本地線程ThreadLoacl中,
然后會進入Mybatis的攔截器中。然后再攔截器中獲取本地線程中保存的分頁的參數。最后再將這些分頁
參數和原本的sql以及內部定義好的sql進行拼接完成sql的分頁處理。中間會進行判斷該sql 的類型是查詢
還是修改操作。如果是查詢才會進入分頁的邏輯並判斷封裝好的Page對象是否是null
null則不分頁,否則分頁。
IPage內部原理也是基於攔截器,但是這個攔截的是方法以及方法中的參數,這個也會判斷是否是查詢操作。
如果是查詢操作,才會進入分頁的處理邏輯。 進入分頁邏輯處理后,攔截器會通過反射獲取該方法的參數
進行判斷是否存在IPage對象的實現類。如果不存在則不進行分頁,存在則將該參數賦值給IPage對象。
然后進行拼接sql的處理完成分頁操作。
但是使用IPage需要注入一個bean攔截器交給spring進行管理。如下。否則不會進行攔截。
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
pom: springboot使用的是2.1.0
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatisplus.version}</version><!-- 3.2.0 -->
<exclusions>
<exclusion>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
</exclusion>
</exclusions>
</dependency>
IPage的好處:
適用於多方言的數據庫類型;例如 MySQL、Oracle、SqlServer等。
注意:如果兩個一起用,內部會先執行IPage的攔截器並進行分頁 然后會進入的PageHelper的分頁處理。
優先使用的是IPage並且PageHelper會出現問題(不論誰前誰后)。返回Page是沒問題的,
但是如果返回集合的結果集使用PageInfo進行分頁就會出現問題。PageHelper只會有指定條數的數據。
所以只能使用一個,如果兩個一起使用,則使用IPage返回Page接收。不可已使用PageInfo進行接收數據。
(當然這個的前提也是對同一個sql進行分頁操作並返回的集合結果集)