MyBatis-Plus分頁——PageHelper和IPage介紹
阿新 • • 發佈:2020-09-07
兩個都用於分頁,常用的應該是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等。 注意:如果兩個一起用對同一個sql進行分頁,內部會先執行IPage的攔截器並進行分頁 然後會進入的PageHelper的分頁處理。 優先使用的是IPage並且PageHelper會出現問題(不論誰前誰後)。返回Page是沒問題的,但是如果返回集合的結果集使用PageInfo進行分頁就會出現問題。PageHelper只會有指定條數的資料。 所以只能使用一個,如果兩個一起使用,則使用IPage返回Page接收。不可以使用PageInfo進行分頁資料。(當然這個的前提也是對同一個sql進行分頁操作並返回的集合結果集,正常來說也不會這麼幹,就隨便提一嘴)