項目中用到了PageHelper插件進行實現分頁,分頁實現非常簡單,引入依賴 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.10</version> </dependency>
在調用數據庫查詢的方法前面添加
PageHelper.startPage(page.getPageNum(), page.getPageSize());
然後執行查詢方法
List<ObjPO> list = testMapper.getList(param);
這樣就實現了分頁了,而且對象是個Page類型的對象,獲取總記錄數就可以用
int totalCount = ((Page)list).getTotal();
消除分頁的方法就用
PageHelper.clearPage();
這個代碼後面的所有查詢就不再進行分頁了。
太簡單了,但是怎麼實現的呢?帶着疑問進行了一下追蹤,簡單的在此描述下,以免日後忘記。
PageHelper.startPage會生成一個Page對象放到threadlocal中。執行查詢的時候,
PageInterceptor攔截器會攔截查詢,進行判斷是否分頁,如果需要分頁的話,就執行
beforeCount()判斷是否進行count查詢,是的話,就組裝sql,在要查詢的sql最外層套一層select count(0) from ,同時彙報order by幹掉。查詢出來的總數量會通過
afterCount()方法賦值給ThreadLocal裏面page對象的total對象。後續就會將分頁的信息組裝到limit中,然後結果集組裝到page對象中最後返回。 Page其實是繼承了ArrayList的一個集合。
PageHelper.clearPage();這個方法會把ThreadLocal裏面的當前線程的信息刪掉。所以這個之後不會再進行分頁。