两种情况

分两种情况:

  1. 查出来为 PageQueryRespDTO
  2. 查出来直接是 Model

查出来为 PageQueryRespDTO

public PageInfo<PageQueryRespDTO> queryPageList(PageQueryReqDTO dto) {       PageHelper.startPage(dto.getPageNum(), dto.getPageSize());List<PageQueryRespDTO> result = xxMapper.queryPageList(dto);return new PageInfo<>(result);
}

查出来直接是 Model

public PageInfo<PageQueryRespDTO> queryPageList(PageQueryReqDTO dto) {         PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); // 设置查询条件    Model model = PageQueryReqDTO.convert(dto);List<Model> modelList = xxMapper.queryListByCondition(model);// PageInfo是个泛型,在 new PageInfo<>(modelList)的时候可以把页码、页大小、总页数等信息给pageinfo    PageInfo<Model> modelPageInfo = new PageInfo(modelList);PageInfo<RespDTO> respPageInfo = new PageInfo<>();// 将查到的数据复制到返参中    List<RespDTO> resultList = new ArrayList<>();    if (CollectionUtils.isNotEmpty(modelList)) {        modelList.stream().forEach(model -> {            RespDTO respDto = new RespDTO();            BeanUtils.copyProperties(model, respDto);            resultList.add(respDto);       });    }// 复制分页属性    BeanUtils.copyProperties(modelPageInfo, respPageInfo);    target.setList(resultList);        return respPageInfo;
}

第二种情况更优雅的实现方式

对于第一种情况没什么好说的,针对第二种情况,其实有更优雅的实现方法:

  • 自定义一个 BasePageResponse,即简化版的 PageInfo
  • 将参数传值的逻辑封装到POJO中,Service只做逻辑
  1. 自定义一个 BasePageResponse
@Data
public class BasePageResponse<T> {/*** 当前页*/private int pageNum;/*** 每页的数量*/private int pageSize;/*** 总记录数*/private long total;/*** 当前页的数量*/private int size;/*** 总页数*/private int pages;/*** 是否有下一页*/private boolean hasNextPage = false;/*** 分页数据*/private List<T> list;public static <T> BasePageResponse<T> convert(PageInfo<?> pageInfo) {BasePageResponse<T> pageResponse = new BasePageResponse<>();pageResponse.setPageNum(pageInfo.getPageNum());pageResponse.setPageSize(pageInfo.getPageSize());pageResponse.setTotal(pageInfo.getTotal());pageResponse.setSize(pageInfo.getSize());pageResponse.setPages(pageInfo.getPages());pageResponse.setHasNextPage(pageInfo.isHasNextPage());return pageResponse;}public static <T> BasePageResponse<T> convert(BasePageResponse<?> pageInfo) {BasePageResponse<T> pageResponse = new BasePageResponse<>();pageResponse.setPageNum(pageInfo.getPageNum());pageResponse.setPageSize(pageInfo.getPageSize());pageResponse.setTotal(pageInfo.getTotal());pageResponse.setSize(pageInfo.getSize());pageResponse.setPages(pageInfo.getPages());pageResponse.setHasNextPage(pageInfo.isHasNextPage());return pageResponse;}
}

可以发现,就是一个简易版的PageInfo,通过自定义一个 BasePageResponse,可以将页面参数赋值的逻辑封装到BasePageResponse中。

比如现在要查一个User表的信息,但是并不需要全部信息,各类信息如下:

  • UserInfo:user表的model
  • UserQueryPageReqDTO:请参
  • UserQueryPageRespDTO:返参

UserInfo

@Data
class UserInfo {private Long id;private String name;private String age;private String address;  // 地址信息不想暴露
}
  1. 将参数转换的逻辑封装到UserQueryPageRespDTO中

UserQueryPageRespDTO

@Builder
@Data
class UserQueryPageRespDTO {private Long id;private String name;private String age;// 由于地址信息不想暴露,故在返参中没有给出地址信息public static BasePageResponse<UserQueryPageRespDTO> convert(PageInfo<UserInfo> pageInfo) {BasePageResponse<UserQueryPageRespDTO> pageResponse = BasePageResponse.convert(pageInfo);pageResponse.setList(convert(pageInfo.getList()));return pageResponse;}private static List<UserQueryPageRespDTO> convert(List<UserInfo> infoList) {if (CollectionUtils.isEmpty(infoList)) {return Collections.emptyList();}return infoList.stream().map(UserQueryPageRespDTO::convert).collect(Collectors.toList());}/*** 参数赋值* * 关于BeanUtils.copyProperties():* 当RespDTO参数是Model的子集时,比较适合BeanUtils.copyProperties()去传递两者的属性值,比如上述情况* 但是有时候我们的返参中往往会对Model的参数进行一些处理,这时候就不适合用BeanUtils.copyProperties()* 而且,不采用BeanUtils.copyProperties()的方式可以看到赋值的过程,也有利于后期维护*/public static UserQueryPageRespDTO convert(UserInfo userInfo) {return UserQueryPageRespDTO.builder().id(userInfo.getId()).name(userInfo.getName()).age(userInfo.getAge).build();}}
  1. Service层

由于我们将一些参数转换的逻辑都封装到了POJO中,这样使得Service层很简洁

public BasePageResponse<UserQueryPageRespDTO> userQueryPage(UserQueryPageReqDTO dto) {PageHelper.startPage(dto.getPageNum(), dto.getPageSize());List<UserInfo> list = userInfoMapper.queryPageByCondition(dto);PageInfo<UserInfo> pageInfo = new PageInfo<>(list);return UserQueryPageRespDTO.convert(pageInfo);
}

远程调用时的分页查询

另外注意:

当远程调用时,应该将PageHelper.startPage(dto.getPageNum(), dto.getPageSize());写在被调用服务的一端,因为PageHelper方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。如果把PageHelper.startPage(dto.getPageNum(), dto.getPageSize());写在调用端,分页信息无法传达到被调用端,也就无法分页,查出来的是全部的条数。

详情看原理篇:PageHelper 分页查询「原理篇」

PageHelper 分页查询「实现篇」相关推荐

  1. python对excel某一列去重-「总结篇」Python中所有的Excel操作技巧

    原标题:「总结篇」Python中所有的Excel操作技巧 Python对于Excel的操作是多种多样的,掌握了相关用法就可以随心所欲的操作数据了! 操作xls文件 xlrd(读操作): import ...

  2. php switch 函数,PHP丨PHP基础知识之条件语SWITCH判断「理论篇」

    Switch在一些计算机语言中是保留字,其作用大多情况下是进行判断选择.以PHP来说,switch(开关语句)常和case break default一起使用 典型结构 switch($control ...

  3. 「实战篇」开源项目docker化运维部署-后端java部署(七)

    原创文章,欢迎转载.转载请注明:转载自IT人故事会,谢谢! 原文链接地址:「实战篇」开源项目docker化运维部署-后端java部署(七) 本节主要说说后端的部署需要注意的点,本身renren-fas ...

  4. dreamweaver 正则表达式为属性值加上双引号_「前端篇」不再为正则烦恼

    作者:李一二 转发链接:https://mp.weixin.qq.com/s/PmzEbyFQ8FynIlXuUL0H-g 前言 有不少朋友都为写正则而头疼,不过笔者早已不为正则而烦恼了.本文分享一些 ...

  5. canvas换图时候会闪烁_基于Canvas实现的高斯模糊(上)「JS篇」

    作者:iNahoo 转发链接:https://mp.weixin.qq.com/s/5TxPjznpEBku_ybSMBdnfw 目录 基于Canvas实现的高斯模糊(上)「JS篇」本篇 基于Canv ...

  6. 「GitLab篇」如何用Git平台账号登录建木CI

    介绍 继上一篇博客「Gitee篇」如何用Git平台账号登录建木CI发布后,得到了很多小伙伴们的关注,我趁热打铁推出了如何用Git平台账号登录建木CI 系列的第二篇 「GitLab篇」如何用Git平台账 ...

  7. lgg8配置_LG G8 ThinQ 评测「上手篇」:真小屏旗舰

    原标题:LG G8 ThinQ 评测「上手篇」:真小屏旗舰 --- "你买的是什么手机 ?" --- "买了个 G8 !" --- "什么??&quo ...

  8. 我的理想600字作文计算机方面,我的理想600字作文「8篇」

    我的理想600字作文「8篇」 理想是一个深渊,从跳下那一刻起,就逼迫你奋力搏击.今天,yuwenmi小编为您带来我的理想600字作文,欢迎阅读! 我的理想600字作文[1] 在我心中,埋藏着一个理想, ...

  9. 大数据量下 PageHelper 分页查询性能问题的解决办法

    作者:岁月安然 blog.csdn.net/baidu_38083619/article/details/82463058 前因 项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一 ...

最新文章

  1. 什么是产品Backlog(Product Backlog)?
  2. 黄河科技学院计算机补考好过吗,学生吐槽:重修费每学分240元不该收 黄河科技学院回应:收费合理...
  3. python三维图-python 三维坐标图
  4. how to prepare reading club
  5. Android 曲线图绘制
  6. Unity 开发和配置
  7. [恢]hdu 2138
  8. Apache Spark 黑名单(Blacklist)机制介绍
  9. PCI Geomatica 操作视频专辑
  10. win7安装打印机 计算机,Win7如何安装网络打印机丨Win7安装网络打印机解决方法...
  11. AGV项目底层总结二
  12. Kinect2.0-Python调用-PyKinect2
  13. 北大哲学系杨立华先生
  14. 学生计算机屏幕坏了怎么办,电脑自己检查自己修,如果显示器坏掉我们该怎么办?...
  15. 1bit和1byte_1字节=8bit bit到底是什么?
  16. 2015给自己充电加薪——免费领取极客学院VIP会员
  17. 迪拜国际学术城各所大学中国学生入学人数持续增长
  18. linux ftp服务器防火墙设置,【许望】linux(RHEL) 下 FTP(vsftpd) 服务器的防火墙配置...
  19. Android系统字体
  20. 微信聊天中上怎么用计算机,电脑可以上微信吗,教您电脑怎么用微信

热门文章

  1. ❤️‍辅导孩子写作业我感觉我又秃了,可怜天下父母心❤️‍
  2. H5视频之视频直播(前端, video.js)
  3. 支付宝 php 获取交易时间,问一个在线支付的场景问题,如果支付宝回调通知延时怎么办?...
  4. c语言中10 1是什么意思,维生素c1十是什么意思
  5. wincc的画面怎么用博图打开_博图v13如何打开winccflexible sp4文件
  6. 关于VOV8订单类型有关PO的几个字段设置说明
  7. 常用激活函数:Sigmoid/Softmax/ELU/ReLU/LeakyReLU/Tanh...(Pytorch)
  8. MySQL 实战45讲--笔记
  9. php培训落地页,经典设计:17个最有效的学习着陆页设计的例子_html/css_WEB-ITnose...
  10. Elitebook735 没有插入键解决方法