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分页解决方法总结的主要内容,如果未能解决你的问题,请参考以下文章

BootStrap有用代码片段(持续总结)

BootStrap实用代码片段(持续总结)

Java 8 新特性总结

项目代码设计规范总结之分页查询

VsCode 代码片段-提升研发效率

Java 基础语法方法的使用