PageHelper.startPage和new PageInfo(list)的一些探索和思考


PageHelper.startPage和new PageInfo(list)的一些探索和思考

https://blog.csdn.net/shijiujiu33/article/details/99477704

Mybatis使用pageHelper步驟

http://www.mamicode.com/info-detail-1725069.html

分類專欄: Mybatis
版權
平常我們使用分頁插件的時候,都是很機械的套用

PageHelper.startPage(1, 10);
Example example = new Example(Employee.class);
example.createCriteria().andEqualTo("employeeSex", "男");
List<Employee> list = employeeTKMapper.selectByExample(example);
PageInfo<Employee> pageinfo=new PageInfo<>(list);
 
先PageHelper.startPage(1, 10)開始分頁,再selectlist查詢數據庫的時候會自動加上limit 1,10,最后封裝成PageInfo的時候會自動帶上頁碼、頁大小、總數等。

問題引入情景:

@Autowired
private EmployeeService employeeService;

public ApiResult<PageInfo> getAllEmloyee() {
PageHelper.startPage(1, 3);
// 調用EmployeeService中的方法
List<Employee> list = employeeService.getAll();
PageInfo<Employee> pageInfo = new PageInfo<>(list);
return ApiResult.success(pageInfo);
}
 


public List<Employee> getAll() {
Example example = new Example(Employee.class);
example.createCriteria().andEqualTo("employeeSex", "男");
List<Employee> list = employeeTKMapper.selectByExample(example);
return list;
}

簡答說就是:在一個方法中使用PageHelper.startPage(1, 3),再調用另一個方法查詢數據庫
這樣的結果:查詢數據庫也是會帶上分頁信息(已驗證,你們可以自己去驗證看一下)

這樣我就在想,為什么PageHelper.startPage(1, 3)會有這么大能力呢?

看一下源碼


protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>();
/**
* 設置 Page 參數
*
* @param page
*/
protected static void setLocalPage(Page page) {
LOCAL_PAGE.set(page);
}

這是setLocalPage()方法,LOCAL_PAGE是當前線程,通常存儲數據為了在同一個線程中都可以訪問到

這里的意思就是 將分頁信息保存在當前線程中

看到這里就豁然開朗了,解釋了上面為什么在另一個方法中執行selectlist的時候也會自動加上分頁信息
因為當前請求就對應一個線程,雖然是方法之間存在調用,但是他們還是處於同一個線程中,共享ThreadLocal中的數據

至於為什么PageHelper.startPage(1, 3)就可以達到分頁效果,這里不做詳細的源代碼解讀(我也沒看過…)
但是我覺得大致流程就是:

分頁插件的使用,首先是在Mybatis里面配置了分頁攔截器(PageInterceptor),即在執行相關Sql之前會攔截做一點事情;
所以應該就是在執行selectlist的時候,會自動為sql加上limit 1,3

還有一點就是使用了PageHelper.startPage,selectlist查詢之后賦值給的List<Employee> list
這個list可以Debug看一下是Page<Employee> 類型
再看一下,Page類是ArrayList子類


所以在new PageInfo<>(list)的時候可以把頁碼、頁大小、總頁數等信息給pageinfo

可以看一下,new PageInfo<>(list)源碼

這又讓我想到了,如果把PageHelper.startPage(1, 3)去掉,將查詢出來的list,再new PageInfo<>(list)

Debug看了一下

沒有PageHelper.startPage(1, 3),查詢的list是ArrayList類型:所以肯定就是走下面的
else if (list instanceof Collection)...

以上就是我對PageHelper.startPage和new PageInfo<>(list)的一些探索和思考
————————————————
版權聲明:本文為CSDN博主「xiaoshijiu333」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/shijiujiu33/article/details/99477704


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM