引入pageHelper
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
yml配置
pagehelper:
reasonable: true #分頁合理化參數,預設值為 false 。當該參數設定為 true 時, pageNum<=0 時會查詢第一頁, pageNum>pages (超過總數時),會查詢最後一頁。預設 false 時,直接根據參數進行查詢
注意:隻有緊跟着PageHelper.startPage()的sql語句才被pagehelper起作用
不需要分頁 就不要執行這個startPage方法,否則将引起不想要執行分頁的SQL卻執行了分頁
我這裡使用了封裝于BaseMapper.java的tableQuery方法,該方法代碼如下
/**
* 單表/多表關聯可用,支援pageHelper插件的分頁/不分頁查詢功能
* @param query
* @param beanClass
* @return
*/
default <T> List<T> tableQuery(IQuery query, Class<T> beanClass) {
HttpHolder.startPageIfNeed();
List<Map<String, Object>> list = this.listMaps(query);
if(null == list) return new ArrayList<>();
List<T> pojoList = new ArrayList<>();
boolean isSimpleValueType = ClassUtil.isSimpleValueType(beanClass);
for (Map<String, Object> m : list) {
T o = null;
if(isSimpleValueType){
ArrayList arrayList = new ArrayList(m.values());
o = arrayList.size() > 0 ? (T)arrayList.get(0) : null;
}else{
o = (T) BeanTool.mapToCamelBean(m, beanClass);
}
pojoList.add(o);
}
if(list instanceof Page) {//分頁
Page page = (Page)list;
Page<T> newPage = new Page();
newPage.setPageNum(page.getPageNum());
newPage.setPages(page.getPages());
newPage.setTotal(page.getTotal());
newPage.addAll(pojoList);
return newPage;
}else{//不分頁
return pojoList;
}
}
其中關鍵的執行分頁與否的動作HttpHolder.startPageIfNeed();詳細代碼如下
這是一個基于ThreadLocal的線程級别變量的功能
/**
* 若需要分頁,則執行分頁參數設定
*/
public static void startPageIfNeed(){
if (HttpHolder.needPage()){
NeedPage needPage = HttpHolder.getNeedPage();
PageHelper.startPage(needPage.getPage(), needPage.getLimit(),true);
}
}
service層的代碼
public void pageQuery(){
List<JSONObject> pageList = companyMapper.tableQuery(companyMapper.emptyQuery(), JSONObject.class);
return pageList;
}
controller層的代碼
@RequestMapping("test")
public Ret test(){
return Ret.tableData(mybatisService.pageQuery());
}
關于傳回Ret.tableData方法的詳細代碼
/**
* layui的table資料傳回模式
* @param data 由mapper.tableQuery方法傳回的資料
* @param totalRow 統計行資訊
* @return
*/
public static <T> Ret<List<T>> tableData(List<T> data,JSON... totalRow){
Ret ret = Ret.builder().success(true).code("0").data(data).build();
if(ArrayUtil.isNotEmpty(totalRow)){
ret.setTotalRow(totalRow[0]);
}
if(data instanceof Page){//分頁
Page page = (Page)data;
ret.setCount(page.getTotal());
}
return ret;
}
postman請求
分頁查詢結果
請看分頁查詢結果類型是Page,是以可以使用上述Ret.tableData方法提取查詢條件的總結果數和分頁結果
postman響應
{
"success": true,
"data": [
{
"companyName": "公司B",
"updateTime": "2023-07-31 23:37:08",
"companyId": 12,
"createTime": "2023-07-31 23:37:10"
},
{
"companyName": "公司CC",
"updateTime": "2023-07-31 23:44:28",
"companyId": 13,
"createTime": "2023-07-31 21:57:16"
}
],
"status": 0,
"code": "0",
"count": 3
}
共有3條記錄,根據分頁資訊 ,傳回對應的2行