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