分页需要用到的俩个参数;pageNum(页码)、pageSize(每页的条数)
有时候前端(移动端)传递的是start(从多少条记录开始)、count(获取的数量,也就是条数)
后端方法需要的是;pageNum和pageSize
一、将start、count转换为pageNum和pageSize
(一)、定义PageCounter类
@Getter
@Setter
@Builderpublic classPageCounter {//当前页码
privateInteger pageNum;//每页的条数
privateInteger pageSize;
}
(二)、将 start、count转换为pageNum、pageSie
public classCommonUtil {//将 start、count转换为pageNum、pageSie
public staticPageCounter converToPageParameter(Integer start, Integer count){int pageNum = start/count;
PageCounter pageCounter=PageCounter.builder()
.pageNum(pageNum)
.pageSize(count)
.build();returnpageCounter;
}
}
二、分页的实现方法
mybatis 里的pager 分页-
(一)、pom.xml安装pagehelper
com.github.pagehelper
pagehelper
4.1.0
(二)、例子
@Override
public ServerResponse getOrderList(Integer userId, int pageNum, int pageSize) {
// 传入pageNum, pageSize参数
PageHelper.startPage(pageNum, pageSize);
// 获取orderList
List orderList = orderMapper.selectByUserId(userId);
// 对orderList进行处理,获取对应的volist
List orderVoList = assembleOrderVoList(orderList, userId);
// 使用orderList生成pageInfo
PageInfo pageResult = new PageInfo(orderList);
// 使用orderVoList设置setList
// 注意orderList和orderVoList
pageResult.setList(orderVoList);
return ServerResponse.createBySuccess(pageResult);
}
jpa里使用PageRequest
简单版:
@Overridepublic PagegetLatestPagingSpu(Integer pageNum, Integer pageSize) {
Pageable page= PageRequest.of(pageNum, pageSize, Sort.by("createTime").descending());returnspuRepository.findAll(page);
}
PageRequest.of()将对应的参数传递进去
完整版:
(一)、pom.xml安装dozermapper 用来对java bean进行拷贝
用到的场景:从数据库查询回来的数据,前端不全用的上,需要进行二次封装(Vo),自己一个个属性赋值太浪费时间。这时可以使用dozermapper
要求俩个bean的属性名要一致
com.github.dozermapper
dozer-core
6.5.0
(二)、封装分页实体类
//封装分页实体类
@Getter
@Setter
@NoArgsConstructorpublic class Paging{//总条数
privateLong total;//当前返回的条数
privateInteger count;//当前页吗
privateInteger page;//总页数
privateInteger totalPage;//结果 不确定数组里元素的类型,所以使用泛型
private Listitems;public Paging(PagepageT) {this.initPageParameters(pageT);this.items =pageT.getContent();
}//静态方法,子类可以调用
void initPageParameters(PagepageT) {this.total =pageT.getTotalElements();this.count =pageT.getSize();this.page =pageT.getNumber();this.totalPage =pageT.getTotalPages();
}
}
(三)、对分页进行再次封装,添加DozerBeanMapper功能
//对分页进行再次封装,添加DozerBeanMapper功能//如果不需要进行vo赋值,直接用Paging就行//需要俩个泛型 T是源文件的类型 K是目标文件的类型
public class PagingDozerextends Paging{
@SuppressWarnings("unchecked")public PagingDozer(Page pageT, Classclassk) {this.initPageParameters(pageT);//使用DozerBeanMapper拷贝属性
Mapper mapper =DozerBeanMapperBuilder.buildDefault();
List tList =pageT.getContent();
List voList = new ArrayList<>();//将查询出的数据循环赋值到vo中
tList.forEach(t ->{//t是源文件,classk是目标文件的class
K vo =mapper.map(t, classk);
voList.add(vo);
});this.setItems(voList);
}
}
(四)、service
@Overridepublic PagegetLatestPagingSpu(Integer pageNum, Integer pageSize) {
Pageable page= PageRequest.of(pageNum, pageSize, Sort.by("createTime").descending());returnspuRepository.findAll(page);
}
使用PageRequest生成Pageable
(五)、controller
@RequestMapping(value = "/latest", method =RequestMethod.GET)public PagingDozer getLatestSpuList(@RequestParam(defaultValue = "0") Integer start,
@RequestParam(defaultValue= "10") Integer count
) {
PageCounter pageCounter=CommonUtil.converToPageParameter(start, count);//从数据库查询出的数据
Page page =spuService.getLatestPagingSpu(pageCounter.getPageNum(), pageCounter.getPageSize());return new PagingDozer<>(page, SpuSimplifyVO.class);
}