概述
两种情况
分两种情况:
- 查出来为 PageQueryRespDTO
- 查出来直接是 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只做逻辑
- 自定义一个 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;
// 地址信息不想暴露
}
- 将参数转换的逻辑封装到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();
}
}
- 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 分页查询「实现篇」的全部内容,希望文章能够帮你解决PageHelper 分页查询「实现篇」所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复