引入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行