7、Springboot 集成分頁插件pagehelper

1、官網https://pagehelper.github.io/

2、集成springboot文檔 https://github.com/pagehelper/pagehelper-spring-boot

使用細則:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

example:https://github.com/abel533/MyBatis-Spring-Boot

 

3、分頁插件參數介紹

 

 

分頁插件提供了多個可選參數,在springboot application.properties 中以 pagehelper.<參數名> = <參數值> 的形式進行配置即可,分頁插件可選參數如下

 

參數

說明

dialect

默認情況下會使用 PageHelper 方式進行分頁,如果想要實現自己的分頁邏輯,可以實現 Dialect(com.github.pagehelper.Dialect) 接口,然後配置該屬性爲實現類的全限定名稱。


下面幾個參數都是針對默認 dialect 情況下的參數。使用自定義 dialect 實現時,下面的參數沒有任何作用。

helperDialect

  1. 分頁插件會自動檢測當前的數據庫鏈接,自動選擇合適的分頁方式。 你可以配置helperDialect屬性來指定分頁插件使用哪種方言。配置時,可以使用下面的縮寫值:


oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby

 

特別注意:使用 SqlServer2012 數據庫時,需要手動指定爲 sqlserver2012,否則會使用 SqlServer2005 的方式進行分頁。
你也可以實現 AbstractHelperDialect,然後配置該屬性爲實現類的全限定名稱即可使用自定義的實現方法。

 

offsetAsPageNum

  1. 默認值爲 false,該參數對使用 RowBounds 作爲分頁參數時有效。 當該參數設置爲 true 時,會將 RowBounds 中的 offset 參數當成 pageNum 使用,可以用頁碼和頁面大小兩個參數進行分頁。

rowBoundsWithCount

  1. 默認值爲false,該參數對使用 RowBounds 作爲分頁參數時有效。 當該參數設置爲true時,使用 RowBounds 分頁會進行 count 查詢。

pageSizeZero

  1. 默認值爲 false,當該參數設置爲 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結果(相當於沒有執行分頁查詢,但是返回結果仍然是 Page 類型)。

reasonable

  1. 分頁合理化參數,默認值爲false。當該參數設置爲 true 時,pageNum<=0 時會查詢第一頁,pageNum>pages(超過總數時),會查詢最後一頁。默認false 時,直接根據參數進行查詢。

params

  1. 爲了支持startPage(Object params)方法,增加了該參數來配置參數映射,用於從對象中根據屬性名取值, 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值, 默認值爲pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero

supportMethodsArguments

  1. 支持通過 Mapper 接口參數來傳遞分頁參數,默認值false,分頁插件會從查詢方法的參數值中,自動根據上面 params 配置的字段中取值,查找到合適的值時就會自動分頁。 使用方法可以參考測試代碼中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。

autoRuntimeDialect

  1. 默認值爲 false。設置爲 true 時,允許在運行時根據多數據源自動識別對應方言的分頁 (不支持自動選擇sqlserver2012,只能使用sqlserver),用法和注意事項參考下面的場景五

closeConn

  1. 默認值爲 true。當使用運行時動態數據源或沒有設置 helperDialect 屬性自動獲取數據庫類型時,會自動獲取一個數據庫連接, 通過該屬性來設置是否關閉獲取的這個連接,默認true關閉,設置爲 false 後,不會關閉獲取的連接,這個參數的設置要根據自己選擇的數據源來決定。

aggregateFunctions(5.1.5+)

  1. 默認爲所有常見數據庫的聚合函數,允許手動添加聚合函數(影響行數),所有以聚合函數開頭的函數,在進行 count 轉換時,會套一層。其他函數和列會被替換爲 count(0),其中count列可以自己配置。

重要提示:
當 offsetAsPageNum=false 的時候,由於 PageNum 問題,RowBounds查詢的時候 reasonable 會強制爲 false。使用 PageHelper.startPage 方法不受影響。

 

4、查看pagehelper-spring-boot-starter 引用依賴的結構 (pagehelper-spring-boot/pagehelper-spring-boot-starter/pom.xml)

https://github.com/pagehelper/pagehelper-spring-boot/blob/master/pagehelper-spring-boot-starter/pom.xml

5、原理

(1)mybatis集成pagehelper,需要在Mybatis的配置文件中註冊需要使用的Plugin ,

PageHelper中對應的Plugin實現類就是com.github.pagehelper.PageHelper自身

mybatis plugin 實則是org.apache.ibatis.plugin.Interceptor接口,

因爲Interceptor的核心是其中的plugin(Object target)方法,而對於plugin(Object target)方法的實現,我們在需要對對應的對象進行攔截時會通過org.apache.ibatis.plugin.Plugin的靜態方法wrap(Object target, Interceptor interceptor)返回一個代理對象,而方法入參就是當前的Interceptor實現類。

<plugins> <plugin interceptor="com.github.pagehelper.PageHelper"/> </plugins> 

 

(2) PageHelper攔截的是org.apache.ibatis.executor.Executor的query方法

(3)ThreadLocal:

java.lang.ThreadLocal

(4)PageHelper.startPage(..): 這樣PageHelper會把分頁信息存入一個ThreadLocal變量中,在攔截到Executor的query方法執行時會從對應的ThreadLocal中獲取分頁信息,獲取到了,則進行分頁處理,處理完了後又會把ThreadLocal中的分頁信息清理掉,以便不影響下一次的查詢操作

 (5)com.github.pagehelper.Page: 在進行分頁查詢時,我們的返回結果一般是一個java.util.List,PageHelper分頁查詢後的結果會變成com.github.pagehelper.Page類型,其繼承了java.util.ArrayList,我們自己聲明mapper 方法中的返回爲List時也不會報錯,因爲做了強轉

com.github.pagehelper.Page中包含有返回結果的分頁信息,包括總記錄數,總的分頁數等信息,所以一般我們需要把返回結果強轉爲com.github.pagehelper.Page類型

6、框架集成

(1)導入maven依賴

只需要導入pagehelper-spring-boot-starter 依賴,其他的不需要

 

(2)配置pagehelper參數(配置幾個常用核心參數,,其他參數可以根據業務情況配置) 

注意: 在springboot 、mybatis、 pagehelper的集成中,不需要在手動爲mybatis添加plugin, 因爲pagehelper-spring-boot-starter 已經做了自動化配置

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章