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

【Java】—JavaBean转换方法详解

JavaBean间的转换

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

文章目录

  • JavaBean间的转换
    • 1 Apache Commons BeanUtils
    • 2 Spring的BeanUtils
    • 3 Json序列化转换
    • 4 MapStruct


前面文章中提到了VO、DTO、BO、PO等概念(【Java】—一篇搞懂POJO和VO、BO、DTO、PO模型),在实际工程中对于一次请求可能涉及到多个对象转换过程,如果对于每一次转换都手动去维护一个转换方法工作量是非常大的,而且在后续业务拓展时,如果我们有增加字段的需求,对于每一层的转换方法都要去维护变更,这是一件很麻烦的事情,所以下面推荐一些可以实现自动转换的方法,这里我们先定义一个用户的DTO对象和PO对象

  • UserDTO:
@Data
public class UserDTO implements Serializable {private long id;private String userName;private String shortName;private int age;
}
  • UserPO:
@Data
public class UserPO implements Serializable {private long id;private String userName;private int age;
}

1 Apache Commons BeanUtils

Apache Commons BeanUtils 提供了 PropertyUtils.copyProperties()BeanUtils.copyProperties()方法来实现对象之间属性的拷贝。

PropertyUtils.copyProperties() 使用方法为例:

// 方法封装
public static void copyProperties(Object dest, Object orig) {try {// 入参1为目标转换对象PropertyUtils.copyProperties(dest, orig);} catch (Exception e)throw e;
}

特点:

  • PropertyUtils支持为null的场景;

缺点:

  1. 它的性能问题相当差;
  2. PropertyUtils有自动类型转换功能,而java.util.Date恰恰是其不支持的类型;

2 Spring的BeanUtils

对于一个Spring项目来说,这是一种常用方法,封装示例如下:

// 方法封装
public static void copyProperties(Object orig, Object dest) {try {// 入参2为目标转换对象PropertyUtils.copyProperties(orig, dest);} catch (Exception e)throw e;
}

特点:

  • 速度相对快一些;
  • 第一个参数是源bean,第二个参数是目标bean,与上面的相反;

缺点:

  1. BeanUtils没有自动转换功能,遇到参数名相同,类型不同的参数不会进行赋值;
  2. BeanUtils对部分属性不支持null的情况,Ineger、Boolean、Long等不支持;

3 Json序列化转换

这种方法就是将java对象转换为json,然后将JSON转换成Java对象。这里以Spring默认的序列化框架jackson为例:

public class JsonConvertExample {private static final ObjectMapper MAPPER = new ObjectMapper();public static void main(String[] args) {UserPO userPO = new UserPO();userPO.setId(1L);userPO.setUserName("ABigTree");userPO.setAge(22);String json = MAPPER.writeValueAsString(userPO);UserDTO userDTO = MAPPER.readValue(json, UserDTO.class);}
}

特点:

  • 属性名需保持一致,或通过配置Json序列化的相关设置来满足相关需求
  • 多了序列化与反序列化过程,性能大打折扣;

缺点:

  • 多此一举,全是缺点😂

4 MapStruct

现在要介绍一个性能爆炸、高级优雅、大厂标准的转换方法,MapStruct框架,要使用MapStruct需要先在pom.xml中添加依赖:

<dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId>
</dependency>

如果要使用 MapStruct 库进行对象之间的映射,首先需要定义一个 Mapper 接口,并在接口中编写映射方法。然后,MapStruct 库会自动生成对应的映射实现类,接口定义如下:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;@Mapper
public interface UserMapper {UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);@Mapping(source = "shortname", target = "userName")UserPO toUserPO(UserDTO dto);
}

除了同名字段自动转换的功能,MapStruct还支持@Mapping等注解去配置转换过程中细节实现。

对于MapStruct为什么性能爆炸和MapStruct的进阶用法,这里先挖个坑,后面去开坑详细介绍~

相关文章:

【Java】—JavaBean转换方法详解

JavaBean间的转换 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 文章目录 JavaBean间的转换1 Apache Co…...

[Vue3核心语法] setup语法糖

一、setup 概述 setup是Vue3中一个新的配置项&#xff0c;值是一个函数&#xff0c;它是 Composition API “表演的舞台”&#xff0c;组件中所用到的&#xff1a;数据、方法、计算属性、监视......等等&#xff0c;均配置在setup中。 特点&#xff1a; setup函数返回的对象中…...

RabbitMQ 入门(三)SpringAMQP五种消息类型(Basic Queue)

一、Spring AMQP 简介 SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; - 自动…...

2024双十一买什么好?双十一高性价比数码好物推荐!

​双十一购物狂欢节即将来临&#xff0c;这是一年中家电和数码产品优惠力度较大的时候。然而&#xff0c;随着产品种类越来越丰富&#xff0c;选择一款合适的商品也变得越发困难。今天&#xff0c;我为大家推荐一些双十一期间值得入手的高品质好物&#xff0c;让我们一同来了解…...

MySQL 查找连续相同名称的记录组,并保留每组内时间最大的一条记录

要求&#xff1a;查找连续相同名称的记录组&#xff0c;并保留每组内时间最大的一条记录&#xff0c;同时计算每组记录的 num 总和。 今天有人问了我一个问题&#xff0c;大致就是下面这样的数据结构&#xff08;原谅我实在不知道怎么描述这个问题&#xff09; 然后需要得到下面…...

three.js 使用geojson ,实现中国地图区域,边缘流动效果

three.js 使用geojson &#xff0c;实现中国地图区域&#xff0c;边缘流动效果 在线链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyexpand&idgeoBorder 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.co…...

数据中台业务架构图

数据中台的业务架构是企业实现数据驱动决策和业务创新的关键支撑。它主要由数据源层、数据存储与处理层、数据服务层以及数据应用层组成。 数据源层涵盖了企业内部各个业务系统的数据&#xff0c;如 ERP、CRM 等&#xff0c;以及外部数据来源&#xff0c;如社交媒体、行业数据…...

Docker学习笔记(2)- Docker的安装

1. Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a;Docker镜像就像是一个模板&#xff0c;可以通过这个模板来创建容器服务。通过一个镜像可以创建多个容器。最终服务运行或者项目运行就是在容器中。容器&#xff08;container&#xff09;&#xff1a;Docker…...

PostgreSql的备份和升级

目录 版本概述&#xff1a; 跨大版本数据迁移 QProcess 调用相关进程进行备份和恢复 版本概述&#xff1a; 该数据库版本主要分为主要版本和次要版本&#xff0c;大版本基本每年发布一次&#xff0c;小版本则每几个月即发布&#xff0c;更新较快。在10.0之前所使用的数据库版…...

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键 文章目录 联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键1. 进入BIOS快捷键2. 快速进入BIOS设置界面3. 快速进入启动项选择界面 1. 进入BIOS快捷键 进入BIOS设置界面的快捷键为F2快速进入启动项选择界面的快捷键为F12 2. 快速进…...

compose navigation 自定义navtype

Jetpack compose navigation with custom NavType https://www.youtube.com/watch?vqBxaZ071N0c&t182s 定义两个路由 Serializable data object DogListRouteSerializable data class DogDetailRoute(val dog: Dog,val breedSize: BreedSize ) 即两个页面&#xff0c;…...

实现对redis过期键监听案例

开发背景 为了实现当经纪人A提交分佣后如果三天后其他经纪人没有确认分佣就自动确认分佣&#xff0c;如果经纪人A修改分佣后再次提交分佣&#xff0c;时间重置为三天 实现方式 第一步&#xff1a;引入依赖 <dependency> <groupId>redis.clients</groupId> …...

yocto基础 -- bb 文件字段解析

Yocto .bb 文件字段解析 本文详细讲解了 Yocto .bb 文件中各字段的作用和用法&#xff0c;包括 SECTION、SRC_URI、SUMMARY 等&#xff0c;旨在帮助开发者更好地理解和使用 Yocto 构建系统。 目录 1. SECTION 字段 1.1 SECTION 的作用1.2 SECTION 的用法1.3 如何使用 SECTIO…...

Android开发相关的重要网站

本文整理Android相关的重要网站&#xff0c;欢迎大家分享别的网站。 AOSP 官网谷歌官方Android源码搜索Android Issue Tracker 如果在开发过程中遇到与 Android 相关的问题或发现了系统的 bug&#xff0c;可以在这个网站上提交反馈&#xff0c;也可以查询是否存在类似的问题。…...

MySQL 中utfmb3和utfmb4字符集区别

目录 一&#xff1a;utf-8二&#xff1a;utf8mb3三&#xff1a;uft8mb4 一&#xff1a;utf-8 unicode 定义了一套规范来存储各种字符&#xff0c;但是它没有定义这些字符在计算机中应该如何存储。所以基于这种原因&#xff0c;后续基于 Unicode 字符集发展出了多种字符的存储规…...

【C语言】文件操作(1)(文件打开关闭和顺序读写函数的万字笔记)

文章目录 一、什么是文件1.程序文件2.数据文件 二、数据文件1.文件名2.数据文件的分类文本文件二进制文件 三、文件的打开和关闭1.流和标准流流标准流 2.文件指针3.文件的打开和关闭文件的打开文件的关闭 四、文件的顺序读写1.fgetc函数2.fputc函数3.fgets函数4.fputs函数5.fsc…...

今日总结10.18

Exception 和Error 有什么区别 Exception和Error都是Java等编程语言中异常处理机制的重要组成部分&#xff0c;它们都继承自Throwable类。以下是两者的主要区别&#xff1a; 定义与性质 Error&#xff1a; 1.表示严重的系统级错误&#xff0c;如内存溢出&#xff08;OutOfM…...

React Agent 自定义实现

目录 背景 langchin 中的 agent langchin 中 agent 的问题 langchain 的 agent 案例 自定义 React Agent 大模型 工具定义 问题设定 问题改写&#xff0c;挖掘潜在意图 React Prompt 下一步规划 问题总结 代码 背景 之前使用过 langchian 中的 agent 去实现过一些…...

RabbitMQ 入门(六)SpringAMQP五种消息类型(Direct Exchange)

一、发布订阅-DirectExchange&#xff08;路由模式&#xff09; 在Fanout模式中&#xff0c;一条消息&#xff0c;会被所有订阅的队列都消费。但是&#xff0c;在某些场景下&#xff0c;我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。 Direct Exchan…...

2062:【例1.3】电影票

【题目描述】 已知一位小朋友的电影票价是10元&#xff0c;计算x位小朋友的总票价是多少&#xff1f; 【输入】 输入x。 【输出】 人数和电影票总价&#xff0c;中间用一个空格隔开。 【输入样例】 2 【输出样例】 2 20 Code #include<iostream> using namespace st…...

使用Spring AI Alibaba构建智能体Agent竟

背景 在软件开发的漫长旅途中&#xff0c;"构建"这个词往往让人又爱又恨。爱的是&#xff0c;一键点击&#xff0c;代码变成产品&#xff0c;那是程序员最迷人的时刻&#xff1b;恨的是&#xff0c;维护那一堆乱糟糟的构建脚本&#xff0c;简直是噩梦。 在很多项目中…...

模拟解析:宽度数组 `[1,2,1]`,10个条目的 XRef 流

文章目录 模拟解析&#xff1a;宽度数组 [1,2,1]&#xff0c;10个条目的 XRef 流一、设定场景二、解析代码核心部分&#xff08;与之前相同&#xff09;三、逐条解析&#xff08;模拟 CPU 执行&#xff09;辅助函数 GetVarInt 回顾条目0 (j0, objnum0)条目1 (j1, objnum1)条目2…...

不用单片机!纯数字电路实现篮球24秒倒计时器(附完整电路图)

纯硬件打造篮球24秒计时器&#xff1a;从零构建数字电路实战指南 篮球比赛的24秒规则是这项运动最具标志性的计时机制之一。对于电子爱好者而言&#xff0c;用纯硬件电路实现这一功能不仅是一次绝佳的学习机会&#xff0c;更能深入理解数字电路设计的精髓。本文将带你完整构建一…...

WebP图片处理全攻略:如何让Java的Thumbnails支持最新图片格式(含SPI机制解析)

WebP图片处理全攻略&#xff1a;Java生态下的高效解决方案与SPI机制深度解析 WebP作为Google推出的新一代图片格式&#xff0c;凭借其卓越的压缩效率和动画支持能力&#xff0c;正在逐步改变互联网图像存储与传输的格局。根据最新行业统计&#xff0c;采用WebP格式的网站平均可…...

如何快速开始使用BeRoot:权限提升检测的10个核心技巧

如何快速开始使用BeRoot&#xff1a;权限提升检测的10个核心技巧 【免费下载链接】BeRoot Privilege Escalation Project - Windows / Linux / Mac 项目地址: https://gitcode.com/gh_mirrors/be/BeRoot BeRoot Project是一款强大的权限提升检测工具&#xff0c;专为Win…...

这份数据挖掘方法实战选择指南,将带你掌握实战中如何选对方法,用好数据挖掘,助力你在实战中斩获佳绩。

好的&#xff0c;针对“机器学习中数据挖掘方法与选择&#xff0c;结合实战使用与实例选择详解”这一问题&#xff0c;我们首先进行解构与推演。 核心问题在于如何在实战中为不同数据集和目标选择合适的预处理与挖掘方法。 答案将聚焦于一个从目标出发、数据驱动、迭代验证的…...

Miniconda-Python3.11镜像实测:轻量级环境管理,AI开发更高效

Miniconda-Python3.11镜像实测&#xff1a;轻量级环境管理&#xff0c;AI开发更高效 1. 为什么选择Miniconda-Python3.11 在AI开发领域&#xff0c;Python环境管理一直是个令人头疼的问题。不同项目可能需要不同版本的Python和依赖库&#xff0c;传统的全局安装方式经常导致版…...

Intv_AI_MK11助力后端开发:构建基于大模型的智能API服务

Intv_AI_MK11助力后端开发&#xff1a;构建基于大模型的智能API服务 1. 智能API服务的时代机遇 最近跟几个做后端开发的朋友聊天&#xff0c;发现大家都在讨论同一个问题&#xff1a;如何把大模型能力快速集成到现有系统中。传统做法要么调用第三方API&#xff08;贵且慢&…...

精通传感器融合:基于 KITTI 数据的 LiDAR 障碍物检测 — 第一部分

原文&#xff1a;towardsdatascience.com/sensor-fusion-kitti-lidar-based-obstacle-detection-part-1-9c5f4bc8d497?sourcecollection_archive---------4-----------------------#2024-12-25 如何使用 LiDAR 数据进行无监督学习的障碍物检测 https://medium.com/eroltak?s…...

SEO_从零开始,手把手教你制定SEO执行计划

SEO: 从零开始&#xff0c;手把手教你制定SEO执行计划 在当今数字化时代&#xff0c;网站的SEO&#xff08;搜索引擎优化&#xff09;是提高网站流量、吸引目标用户的关键。如果你是一个从零开始的SEO爱好者&#xff0c;可能会觉得这个领域有点复杂。不过&#xff0c;别担心&a…...