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

po与vo互转工具类

po转vo工具类

  • 1.反射调用
  • 2.JSON序列化方式
  • 3.注解驱动
  • 4.ModelMappe
  • 5.手动映射
  • 6.总结
  • 7.扩展方法

1.反射调用

这个方法会创建一个新的实例,并将所有公共字段复制到目标对象中,而不修改原来的实例。因此,如果目标类包含 private 或 final 字段,则需要额外的手动处理。

1.工具类

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;public class PoVoConverter<T, V> {protected final Class<T> clazz;public PoVoConverter(Class<T> clazz) {this.clazz = clazz;}public T voToPo(V vo) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {T po = clazz.newInstance();Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);Field voField = vo.getClass().getDeclaredField(declaredField.getName());voField.setAccessible(true);declaredField.set(po, voField.get(vo));}return po;}public V poToVo(T po) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {V vo = clazz.newInstance();Field[] declaredFields = clazz.getDeclaredFields();for (Field declaredField : declaredFields) {declaredField.setAccessible(true);Field poField = po.getClass().getDeclaredField(declaredField.getName());poField.setAccessible(true);declaredField.set(vo, poField.get(po));}return vo;}
}

2.使用方式

PoVoConverter<User, UserVo> converter = new PoVoConverter<>(User.class);
User user = converter.voToPo(userVo);
UserVo userVo = converter.poToVo(user);

3.总结
优势:简单易懂,不需要任何额外配置
劣势:性能较差,因为需要多次反射调用,而且有可能遇到安全限制

2.JSON序列化方式

  • 该方法使用 Jackson 库将 VO 对象转换为 JSON 字符串,并将字符串反序列化回 PO 类型,以此实现转换
  • 注意:此方法的优点是效率较高,但是可能需要管理 JSON 库的依赖关系

1.工具类

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;public class PoVoConverter<T, V> {protected final Class<T> clazz;public PoVoConverter(Class<T> clazz) {this.clazz = clazz;}public T voToPo(V vo) throws IOException {ObjectMapper mapper = new ObjectMapper();return mapper.readValue(mapper.writeValueAsString(vo), TypeFactory.defaultInstance().constructType(clazz));}public V poToVo(T po) throws IOException {ObjectMapper mapper = new ObjectMapper();return mapper.readValue(mapper.writeValueAsString(po), TypeFactory.defaultInstance().constructType(clazz));}
}

2.使用方式

PoVoConverter<User, UserVo> converter = new PoVoConverter<>(User.class);
User user = converter.voToPo(userVo);
UserVo userVo = converter.poToVo(user);

3.总结
优势:高性能,适用于大数据量的情况
劣势:需要额外的 JSON 库支持,如果 JSON 字符串过大,则可能导致内存溢出

3.注解驱动

推荐使用 JSON 序列化方法,因为它具有较高的性能并且易于理解和维护。如果需要更高的安全性,可以考虑使用注解驱动方法

1.代码

@Service
@MapperScan("com.andy.mapper")
public interface UserMapper {@Mappings({@Mapping(source = "vo.id", target = "id"),@Mapping(source = "vo.name", target = "name"),@Mapping(source = "vo.age", target = "age")})User poToVo(UserVo vo);@Mappings({@Mapping(source = "id", target = "vo.id"),@Mapping(source = "name", target = "vo.name"),@Mapping(source = "age", target = "vo.age")})UserVo voToPo(User po);
}

2.总结
优势:简洁明了,易于维护。
劣势:需要使用第三方库,比如 MyBatis

4.ModelMappe

这里,模型映射器会自动检测用户类和 VO 类型上的 @Mapping 注解,并将 VO 类型映射到 PO 类型,反之亦然

1.导入坐标

<dependency><groupId>org.modelmapper</groupId><artifactId>modelmapper</artifactId><version>3.2.0</version>
</dependency>

2.使用方式

public class UserService {private ModelMapper modelMapper = new ModelMapper();public UserVo toVo(User po) {return modelMapper.map(po, UserVo.class);}public User toPo(UserVo vo) {return modelMapper.map(vo, User.class);}
}

3.总结
优势:无须手动编写映射代码,易于维护
劣势:可能导致依赖冲突

5.手动映射

这种方式就是我们常用的get()和set()

1.使用方式

public T voToPo(V vo) {T po = clazz.newInstance();po.setId(vo.getId());po.setName(vo.getName());po.setEmail(vo.getEmail());return po;
}public V poToVo(T po) {V vo = clazz.newInstance();vo.setId(po.getId());vo.setName(po.getName());vo.setEmail(po.getEmail());return vo;
}

3.总结
优势:有更多的控制权,适合特定场景
劣势:代码中有大量的get/set

6.总结

方法缺点优点
反射调用性能较低,可能受到安全限制简单易懂,适合小型项目
JSON 序列化需要额外的 JSON 库支持,可能产生大量垃圾信息高效,适合大型项目
注解驱动需要第三方库,复杂度较高易于维护,性能良好
ModelMapper可能导致冲突无须手动编写映射代码,易于维护
手动映射手动编写映射代码更多控制权

7.扩展方法

1.BeanUtils.copyProperties();

2.UserVo userVo = JSON.parseObject(JSON.toJSONString(user), UserVo.class);

相关文章:

po与vo互转工具类

po转vo工具类 1.反射调用2.JSON序列化方式3.注解驱动4.ModelMappe5.手动映射6.总结7.扩展方法 1.反射调用 这个方法会创建一个新的实例&#xff0c;并将所有公共字段复制到目标对象中&#xff0c;而不修改原来的实例。因此&#xff0c;如果目标类包含 private 或 final 字段&am…...

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(三)

员工分页查询和账号启用禁用功能 1. 员工分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 封装PageResult1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.4 代码完善 2. 启用禁用员工账号…...

PyCharm:2023新版PyCharm无UI工具栏,如何回旧版

pycharm2023.3新版本&#xff0c;默认使用新UI&#xff0c;界面突然变化很大&#xff0c;感觉用起来很不适应。。。。于是&#xff0c;在网上搜了一下&#xff0c;确实有回老版的方法&#xff0c;试了一下&#xff0c;确实很nice~~~~ 方法&#xff1a; Settings——>Appea…...

阿里云国际站:云备份

文章目录 一、阿里云云备份的概念 二、云备份的优势 三、云备份的功能 四、云备份的应用场景 一、阿里云云备份的概念 云备份作为阿里云统一灾备平台&#xff0c;是一种简单易用、敏捷高效、安全可靠的公共云数据管理服务&#xff0c;可以为阿里云ECS整机、ECS数据库、文件…...

C#中.NET 6.0 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录

目录 一、应用程序设计 二、应用程序源码 三、生成效果 前文作者发布了在.NET 6.0 控制台应用中通过EF访问已有数据库&#xff0c;事实上&#xff0c;在.NET 6.0 Windows窗体应用中通过EF访问已有数据库也是一样的。操作方法基本一样&#xff0c;数据库EF模型和上下文都是自…...

kafka+ubuntu20.04+docker配置

记录一次配置过程 安装docker 参加下面链接的第一部分 Ubuntu20.04使用docker安装kafka服务-CSDN博客 安装zookeeper docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper安装kafka服务 docker run -d --name kafka …...

遍历一个对象,并得出所对应的值

var dates {//定义的对象year:now.getFullYear(),month:now.getMonth()1,date:now.getDate(),hour:now.getHours(),minute:now.getMinutes(),second:now.getSeconds() }//开始遍历循环 var val; for (val in dates){console.log(对象名称&#xff1a;val-对象的值&#xff1a;…...

WGCLOUD的特点整理

做运维工作很多年了&#xff0c;项目中用过不少的运维软件工具&#xff0c;今天整理下WGCLOUD的特点&#xff08;优点&#xff09; 首先WGCLOUD是完全免费的 部署使用&#xff1a;部署简单方便&#xff0c;上手容易&#xff0c;几乎没有学习成本&#xff0c;对新手友好 文档…...

新版软考高项试题分析精选(三)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1、项目整体管理要综合考虑项目各个相关过程&#xff0c;围绕整体管理特点&#xff0c;以下说法中&#xff0c;&#xff08; &#xff09;是不正确的。 A.项目的…...

从申请服务器到Docker部署Java项目至最后运行完结

目录 1.申请服务器篇 2.配置安全组篇 3.Docker安装篇 4.代码编写打包篇 目录结构 Maven Controller DockerFile 开始打包 5.所需文件上传及镜像构建篇 上传准备 上传jar包及DockerFile文件 指令构建 验证 6.镜像启动服务验证篇 启动镜像 使用云服务器地址进行…...

解决 requests.post 数据字段编码问题的方法

问题背景 在进行网络请求时&#xff0c;我们通常会使用requests库的post方法来发送POST请求。然而&#xff0c;当我们尝试发送包含特殊字符&#xff08;如中文字符&#xff09;的数据时&#xff0c;可能会遇到数据字段被编码的问题。这可能会导致请求失败或者服务器无法正确解…...

安全运维:cmd命令大全(108个)

1、calc&#xff1a;启动计算器 2、appwiz.cpl&#xff1a;程序和功能 3、certmgr.msc&#xff1a;证书管理实用程序 4、charmap&#xff1a;启动字符映射表 5、chkdsk.exe&#xff1a;Chkdsk磁盘检查(管理员身份运行命令提示符) 6、cleanmgr: 打开磁盘清理工具 7、clico…...

构建Docker基础镜像(ubuntu20.04+python3.9.10+pytorch-gpu-cuda11.8)

文章目录 一、前置条件1.创建 ubuntu 镜像源文件【sources.list】2.下载 python 安装包【Python-3.9.10.tgz】 二、构建方法1.构建目录2.创建DockerFile3.打包镜像 一、前置条件 配置一下 ubuntu 的镜像源下载 python 安装包 1.创建 ubuntu 镜像源文件【sources.list】 内容…...

Flowable自定义Id生成器

内置ID生成器 Flowable内置DbIdGenerator(数据库自增ID)、StrongUuidGenerator(UUID)&#xff0c;Flowable默认使用的StrongUuidGenerator看起来太长不好观察数据&#xff0c;可以修改成DbIdGenerator。 Configuration public class FlowableConfig implements EngineConfigu…...

怎样正确选择等保测评机构开展等保测评工作?

随着大家对网络安全的重视&#xff0c;越来越多的企业需要做等保测评了。很多小伙伴想知道怎样正确选择等保测评机构开展等保测评工作&#xff1f;这里就给大家简单说说。 怎样正确选择等保测评机构开展等保测评工作&#xff1f; 【回答】&#xff1a;正确选择等保测评机构开展…...

【论文阅读笔记】Detecting AI Trojans Using Meta Neural Analysis

个人阅读笔记&#xff0c;如有错误欢迎指出&#xff01; 会议&#xff1a;2021 S&P Detecting AI Trojans Using Meta Neural Analysis | IEEE Conference Publication | IEEE Xplore 问题&#xff1a; 当前防御方法存在一些难以实现的假设&#xff0c;或者要求直…...

【PyTorch教程】如何使用PyTorch分布式并行模块DistributedDataParallel(DDP)进行多卡训练

本期目录 1. 导入核心库2. 初始化分布式进程组3. 包装模型4. 分发输入数据5. 保存模型参数6. 运行分布式训练7. DDP完整训练代码 本章的重点是学习如何使用 PyTorch 中的 Distributed Data Parallel (DDP) 库进行高效的分布式并行训练。以提高模型的训练速度。 1. 导入核心库 D…...

Istio学习笔记-体验istio

参考Istio 入门(三)&#xff1a;体验 Istio、微服务部署、可观测性 - 痴者工良 - 博客园 (cnblogs.com) 在本章中&#xff0c;我们将会学习到如何部署一套微服务、如何使用 Istio 暴露服务到集群外&#xff0c;并且如何使用可观测性组件监测流量和系统指标。 本章教程示例使用…...

fastjson 系列漏洞

目录 1、 fastjson 1.2.22-1.2.24 版本 1.1 TemplatesImpl (Feature.SupportNonPublicField) 1.2 JNDI && JdbcRowSetImpl 利⽤链 2、fastjson 1.2.41 3、fastjson 1.2.42/1.2.43 4、fastjson 1.2.44-1.2.45 5、fastjson 1.2.46-1.2.47版本反序列化漏洞 jackson…...

odoo前端js对象的扩展方法

odoo前端js对象的扩展方法 在 Odoo 中&#xff0c;你可以使用两种方法来扩展 JavaScript 对象&#xff1a;extends 和 patch。这两种方法在功能上有一些区别。 extends 方法&#xff1a; 使用 extends 方法可以创建一个新的 JavaScript 对象&#xff0c;并继承自现有的对象。这…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...