1. 程式人生 > 實用技巧 >2020.9.7學習問題

2020.9.7學習問題



兩個都用於分頁,常用的應該是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進行分頁操作並返回的集合結果集)