1. 程式人生 > 實用技巧 >MyBatis-Plus分頁——PageHelper和IPage介紹

MyBatis-Plus分頁——PageHelper和IPage介紹

兩個都用於分頁,常用的應該是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進行分頁操作並返回的集合結果集,正常來說也不會這麼幹,就隨便提一嘴)