当前位置: 首页 > news >正文

MybatisPlus-20.插件功能-通用分页实体与MP转换

一.通用分页实体与MP转换

回顾我们之前写的代码,在查询出分页结果后,数据的非空校验,数据的vo转换都是模板代码,编写起来很麻烦。我们完全可以将其封装到PageQueryDTO的工具方法中,简化整个过程:

package com.itheima.mp.domain.dto;import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mp.domain.po.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;@Data
@ApiModel(description = "分页查询条件实体")
public class PageQueryDTO {@ApiModelProperty("当前页码")private Integer pageNum;@ApiModelProperty("每页记录数")private Integer pageSize;@ApiModelProperty("排序字段")private String sort;@ApiModelProperty("排序方式:asc-升序,desc-降序")private Boolean isAsc;// 封装成MyBatis Plus的Page对象public <T> Page<T> toMpPage(OrderItem ... orderItems) {// 1.创建Page对象,指定当前页码和每页记录数Page<T> page = new Page<>(pageNum, pageSize);// 2.设置排序字段和排序方式if (sort != null) {page.addOrder(new OrderItem(sort, isAsc));} else if (orderItems != null){// 没有排序字段,要传入默认排序字段是什么,按照默认的排序字段进行排序page.addOrder(orderItems);}return page;}// 封装成MyBatis Plus的Page对象,按照create_time进行排序public <T> Page<T> toMpPageOrderByCreateTime() {return toMpPage(new OrderItem("create_time", false));}// 封装成MyBatis Plus的Page对象,按照create_time进行排序public <T> Page<T> toMpPageOrderByUpdateTime() {return toMpPage(new OrderItem("update_time", false));}// 封装成MyBatis Plus的Page对象,按照指定字段进行排序。不用传入OrderItem对象,直接传入字段名和排序方式即可public <T> Page<T> toMpPage(String defaultSortBy, Boolean defaultIsAsc) {return toMpPage(new OrderItem(defaultSortBy, defaultIsAsc));}
}

首先在封装时为了封装为Page对象,我们定义一个toMpPage()方法,该方法的返回值是一个存储类型为泛型的Page对象,用来剥离实际业务进行开发。其中传入参数为可变参数,为OrderItem类型,用来指定排序字段。如果UserQueryDTO中没有排序字段,则按照指定的排序字段进行排序。用户需要创建一个OrderItem对象来指定排序字段。

我们还定义了按照create_time和update_time来排序的方法。以及如果用户不想创建OrderItem对象,但是又想进行排序的话,要求他传入排序字段defaultSortBy和排序顺序字段defaultIsAsc,我们为其创建一个OrderItem类型的对象进行排序。

改造后的代码如下:

@Overridepublic PageVO<UserVO> queryListPage(UserQueryDTO userQueryDTO) {Page<User> page = userQueryDTO.toMpPageOrderByUpdateTime();// 3.将Page查询条件封装进QueryWrapperPage<User> p = lambdaQuery().like(User::getUsername, userQueryDTO.getName()).eq(User::getStatus, userQueryDTO.getStatus()).page(page);}

二.Page<User>对象转为Page<UserVO>对象

此外,我们的代码中创建Page<UserVO>对象,并将Page<User>对象转为Page<UserVO>对象的逻辑也可以将其封装到PageVO的工具方法中:

package com.itheima.mp.domain.vo;import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.mp.domain.po.User;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;@Data
@ApiModel(description = "分页VO实体")
// 定义一个统一的分页结果
public class PageVO<T> {@ApiModelProperty("总记录数")private Long total;@ApiModelProperty("总页数")private Long pages;@ApiModelProperty("当前页数据")private List<T> records;public static <VO, PO> PageVO<VO> of(Page<PO> p, Function<PO, VO> convertor) {// 4.获取查询结果// 4.1 获取总页数Long pages = p.getPages();// 4.2 获取总记录数Long total = p.getTotal();// 4.3 获取当前页数据List<PO> records = p.getRecords();// 5.封装PageVOPageVO<VO> pageVO = new PageVO<>();pageVO.setPages(pages);pageVO.setTotal(total);if (records == null) {pageVO.setRecords(Collections.emptyList());return pageVO;}// 使用stream流和map方法以及函数式语法将当前页数据转换成UserVO,其中函数式编程满足用户特殊的转换需求(解决PO和VO属性名不一致的问题)pageVO.setRecords(records.stream().map(convertor).collect(Collectors.toList()));return pageVO;}
}

我们首先将第一步生成好的Page<PO>对象传入,并获取其属性赋值给Page<VO>对象。接下来就进行最为关键的一步。将Page<PO>对象的当前页数据集合List<PO>转换为List<VO>,并将其封装在Page<VO>对象中。

如果PO和VO的属性名称和类型一样,我们可以使用BeanUtil工具类完成。但是如果两者不一样,那么我们就要进行定制化处理。为了解决这一问题,我们提供一个函数式编程参数,让用户自己去编写转换方法。其中map方法中传入的就是一个函数式编程参数,将其结果返回并收集到List集合中。该List集合作为Page<VO>的当前页数据,将Page<VO>返回。

最终方法如下:

@Overridepublic PageVO<UserVO> queryListPage(UserQueryDTO userQueryDTO) {Page<User> page = userQueryDTO.toMpPageOrderByUpdateTime();// 3.将Page查询条件封装进QueryWrapperPage<User> p = lambdaQuery().like(User::getUsername, userQueryDTO.getName()).eq(User::getStatus, userQueryDTO.getStatus()).page(page);return PageVO.of(p, new Function<User, UserVO>() {@Overridepublic UserVO apply(User user) {UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);// 对用户名进行脱敏userVO.setUsername(user.getUsername().substring(0,user.getUsername().length() - 2) + "**");return userVO;}});}

最终查询的结果如下:

http://www.lryc.cn/news/603659.html

相关文章:

  • 【IQA技术专题】纹理相似度图像评价指标DISTS
  • AAA 与 FTP:网络认证授权及文件传输的原理与实践
  • 如何在 Ubuntu 24.04 或 22.04 Linux 上安装和运行 Redis 服务器
  • Redis的持久化策略-AOF和RDB(详细图解)
  • 广告投放数据与管理全解析:从数据解读到高效运营
  • ansible 使用更高版本的python版本
  • 设计一个高可用、可拓展、监控报警系统,使用普罗米修斯和grafana,并给出go实现
  • 第2章 cmd命令基础:常用基础命令(1)
  • SQL排查、分析海量数据以及锁机制
  • 微算法科技(NASDAQ:MLGO)应用区块链联邦学习(BlockFL)架构,实现数据的安全传输
  • Java:为什么需要通配符捕获(wildcard capture)
  • 大文件的切片上传和断点续传前后端(Vue+node.js)具体实现
  • 巡台效率:精准胜勤快
  • 基于YOLOP与GAN的图像修复与防御系统设计与实现
  • 把查出来的值加上双引号,并逗号分隔
  • 宇树 G1 部署(九)——遥操作控制脚本 teleop_hand_and_arm.py 分析与测试部署
  • 汇总数据(使用聚集函数)
  • 智能制造的空间度量:机器视觉标定技术解析
  • 微店商品详情接口micro.item_get请求参数响应参数解析
  • 以太坊十年:智能合约与去中心化的崛起
  • Linux文件归档和备份
  • 自动调优 vLLM 服务器参数(实战指南)
  • IDEA中全局搜索快捷键Ctrl+Shift+F为何失灵?探寻原因与修复指南
  • ARM7微处理器的核心优势
  • 如何在Windows操作系统上通过conda 安装 MDAnalysis
  • 继续打卡day6
  • 机器学习线性回归:从基础到实践的入门指南
  • Wndows Docker Desktop-Unexpected WSL error错误
  • unity 使用PropertyDrawer 在Inspector 面板上自定义字段的显示方式
  • 天铭科技×蓝卓 | “1+2+N”打造AI驱动的汽车零部件行业智能工厂