PageHelper的簡單追蹤

項目中用到了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裏面的當前線程的信息刪掉。所以這個之後不會再進行分頁。

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