Spring Boot 2.x(十三):你不知道的PageHelper

PageHelper

提及PageHelper,使用過Mybatis的朋友可能不是很陌生,做爲一款國人開發的分頁插件,它基本上知足了咱們的平常需求。可是,我想去官方文檔看看這個東西配合Spring Boot進行使用的時候,發現了這個:java

因此花了一個晚上的時間,研究了一下合理的怎麼玩這個。mysql

快速入門

若是你想在一個Spring Boot項目中快速進行一次分頁操做,只須要兩步便可:git

導入Maven

這裏我導入的是官方最新的:程序員

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.10</version>
</dependency>
複製代碼

使用

// 只有緊跟在PageHelper.startPage方法後的第一個Mybatis的查詢(Select)方法會被分頁!!!!
 PageHelper.startPage(1, 10);
 return PageInfo.of(userService.findAll());
複製代碼

沒錯,只須要兩句代碼便可達到咱們想要的分頁效果github

進階玩法

若是,你僅僅是想簡單的使用分頁功能,那麼這篇文章到這裏對你而言來講就已經結束了,可是做爲一個程序員,你會僅僅知足於初級的玩兒法嗎?不!你不會!因此,接着往下看~spring

從文檔中,咱們能夠看出,做者給咱們提供了不少的參數供咱們配置:sql

helperDialectoffsetAsPageNumrowBoundsWithCountpageSizeZeroreasonableparamssupportMethodsArgumentsautoRuntimeDialectcloseConn等等,咱們能夠經過配置這些屬性來得到更爲強大的效果~數據庫

這裏須要說明一點,網上的教程大部分是讓咱們在xml或者代碼中配置,其實若是你使用的是springboot,幹嗎要捨近求遠呢,咱們能夠直接在Spring boot 的配置文件application.yml中進行配置:springboot

pagehelper:
  # dialect: ①
  # 分頁插件會自動檢測當前的數據庫連接,自動選擇合適的分頁方式(能夠不設置)
 helper-dialect: mysql 
  # 上面數據庫設置後,下面的設置爲true不會改變上面的結果(默認爲true)
 auto-dialect: true 
 page-size-zero: false # ②
 reasonable: true # ③
  # 默認值爲 false,該參數對使用 RowBounds 做爲分頁參數時有效。(通常用不着)
 offset-as-page-num: false 
  # 默認值爲 false,RowBounds是否進行count查詢(通常用不着)
 row-bounds-with-count: false 
  #params: ④
  #support-methods-arguments: 和params配合使用,具體能夠看下面的講解
  # 默認值爲 false。設置爲 true 時,容許在運行時根據多數據源自動識別對應方言的分頁
 auto-runtime-dialect: false # ⑤
  # 與auto-runtime-dialect配合使用
 close-conn: true 
  # 用於控制默認不帶 count 查詢的方法中,是否執行 count 查詢,這裏設置爲true後,total會爲-1
 default-count: false 
  #dialect-alias: ⑥
複製代碼

①:默認狀況下會使用 PageHelper 方式進行分頁,若是想要實現本身的分頁邏輯,能夠實現 Dialect(com.github.pagehelper.Dialect) 接口,而後配置該屬性爲實現類的全限定名稱。(這裏不推薦這樣玩,畢竟你用了別人的插件,幹嗎還要畫蛇添足呢?)mybatis

②:默認值爲 false,當該參數設置爲 true 時,若是 pageSize=0 或者 RowBounds.limit = 0 就會查詢出所有的結果(至關於沒有執行分頁查詢,可是返回結果仍然是 Page 類型)。

這裏須要說一點,雖然返回了所有的結果,可是仍是執行了count的動做,開發者曾在issue中表示後面的版本會修復這個問題

經個人測試,目前是尚未解決的🤔

③:合法性,即糾錯機制,配置reasonabletrue,這時若是 pageNum <= 0 會查詢第一頁,若是 pageNum > pages 會查詢最後一頁。

④:爲了支持startPage(Object params)方法,增長了該參數來配置參數映射,用於從對象中根據屬性名取值, 能夠配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值, 默認值爲 pageNum=pageNum; pageSize=pageSize; count=countSql; reasonable=reasonable; pageSizeZero=pageSizeZerosupport-methods-arguments支持經過 Mapper 接口參數來傳遞分頁參數,默認值false,分頁插件會從查詢方法的參數值中,自動根據上面 params 配置的字段中取值,查找到合適的值時就會自動分頁。

來個小🌰:

@GetMapping("/page1")
    public PageInfo<UserDO> findPage(HttpServletRequest request) {
    	// 直接將請求中含有的參數傳給
        PageHelper.startPage(request);
        return PageInfo.of(userService.findAll());
    }
 	/** * 查詢全部信息 * @return 人員列表 */
    @Select("SELECT * FROM user")
    @Results({
            @Result(property = "userName",  column = "user_name"),
            @Result(property = "password", column = "password")
    })
    List<UserDO> findAll();
	/*****************************************************************/
	
	//這個方法和上面的區別是直接將含有條件的請求傳給了Mapper接口
 	@GetMapping("/page2")
    public PageInfo<UserDO> findPage2(HttpServletRequest request) {
        return PageInfo.of(userService.findPage(request));
    }
    
    //Mapper接口趕上一個的區別就是多了一個參數,SQL徹底一致
	@Select("SELECT * FROM user")
    @Results({
            @Result(property = "userName",  column = "user_name"),
            @Result(property = "password", column = "password")
    })
    List<UserDO> findPage(HttpServletRequest request);
複製代碼

⑤:默認值爲false。設置爲 true 時,容許在運行時根據多數據源自動識別對應方言的分頁,

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

⑥:dialect-alias 參數,容許配置自定義實現的 別名,能夠用於根據JDBCURL自動獲取對應實現,容許經過此種方式覆蓋已有的實現,配置示例如(多個配置用分號;隔開):

pagehelper.dialect-alias=oracle=com.github.pagehelper.dialect.helper.OracleDialect
複製代碼

幾種不一樣的玩法

(小聲BB一句)Lambda是真的好看啊!

//1. offsetPage
        PageHelper.offsetPage(1, 10);
        return PageInfo.of(userService.findAll());
        //2. Lambda
        return PageHelper.startPage(1, 10).doSelectPageInfo(() -> userService.findAll());
複製代碼

源碼地址:

Github Gitee

記得順手點個star,您的確定是對我寫做最大的動力!

參考資料

官方文檔

公衆號

原創文章,文筆有限,才疏學淺,文中如有不正之處,萬望告知。

相關文章
相關標籤/搜索