在做項目中遇到一個問題。分頁功能如果想人工設置一頁展示數量應該設置什么參數。
需求和場景是一頁數據很多,但是就是要一頁把所有數據都展示出來。WTF?
還有導出和列表想用同一個request對象也會遇到這個問題。
開始的時候,是設置 maxLimit 這個參數,然后 searchCount設置成false(不查詢count條數),但是只設置這個參數,對於要一頁展示所有數據這個場景不管用,不管maxLimit 設置多大,還是只查詢10條。為啥???
只能去看mybatis源碼了--------
在項目自己實現的分頁組件中發現了這么一個地方,原來是它這里設置成默認一頁10條記錄
而 BasePage繼承了 mybatisplus的 IPage ,然后會在后續處理。
在打印sql的時候發現 ,對於分頁請求mybatisplus 會默認給sql 語句加上 limit,即使什么參數不傳用這個分頁也會加上。這個玩意是什么時候加上的呢??
而我們知道 mysql和postgresql的分頁就是用limit實現的。而mybatisplus分頁是通過攔截器對sql語句進行預處理,把limit 和參數拼在原始sql后面,然后再將處理過sql語句交給mybatis。
通過一番尋找,具體的調用鏈是這樣的,(懶得畫時序圖了):
com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor#intercept
->com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor#beforeQuery
->com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor#beforeQuery
//設置size ,並且把這個參數設置成 mybatis_plus_first 放到緩存中,后續設值的時候用
->com.baomidou.mybatisplus.extension.plugins.pagination.dialects.PostgreDialect#buildPaginationSql
首先分頁方法通過mybatis plugin 代理找到分頁的攔截器
在 這個方法中 ,處理maxLimit。如果 size 大於 maxLimit,maxLimit才生效。否則還是以size作為一頁展示條數限制
最后是在這個類中將limit拼在sql語句上的
使用這個分頁攔截器,需要在springboot啟動時注入進容器
而分頁組件就是這個設置為size的
最后結論:如果想要一頁顯示很多條數據,就設置IPage的size 參數。