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