对象转换传输规范SpringBeanUtil工具类封装

对象转换传输规范SpringBeanUtil工具类封装

前言

        上一集我们已经完成了SpringBoot3.X + MybatisPlus的逆向工程,这一集我们将会完成对象转换传输规范SpringBeanUtil工具类的封装。

        在讲主要内容的之前,我们将会补充一些小知识。

N方库

在软件开发中,库(Library)是一组预先编写好的代码,可以被多个不同的程序调用以实现特定的功能,从而避免重复编写相同的代码。根据库的来源和使用范围,可以将库大致分为以下几类

一方库(First-party Library)

  • 这些库通常是项目团队自己开发的,仅供本项目或本工程内部的子项目模块使用。
  • 它们可能不会对外发布,或者仅在项目团队内部共享。
  • 由于是内部开发,因此版本控制、更新和维护都由项目团队自己负责。

二方库(Second-party Library)

  • 这类库是由公司内部的其他团队或部门开发的,并且发布到了公司内部的中央仓库中。
  • 它们可供公司内部的其他应用或项目依赖使用,但不会对外公开。
  • 通常,二方库会有一定的版本管理和兼容性保证,以确保公司内部项目的顺利集成和使用。

三方库(Third-party Library)

  • 这是最常见的库类型,指的是由公司外部的组织或个人开发的开源库。
  • 这些库可以在互联网上公开获取,并且遵循特定的开源许可证,允许任何人使用、修改和分发。
  • 三方库的使用可以大大加速开发过程,但同时也需要考虑许可证合规性、安全性和维护更新的问题。

POJO实体类

POJO(Plain Ordinary Java Object)是一个术语,用来描述那些没有遵循特定Java EE规范的Java对象。它们是简单的Java类,通常用于数据传输和业务逻辑的实现。以下是对POJO概念的一些说明:

定义和特点

  • POJO是一个简单的Java类,不依赖于任何特定的Java EE规范。
  • 它们通常只包含标准的JavaBean属性(即私有字段)和对应的getter/setter方法。

用途

  • POJOs常用于表示数据结构,例如在客户端和服务器之间传输的数据。
  • 它们也用于封装业务逻辑,使得代码更加模块化和可重用。

类型

  • DO(Data Object):数据对象,通常用于数据库操作,代表数据库中的一条记录。
  • DTO(Data Transfer Object):数据传输对象,用于不同系统或模块之间的数据传输。
  • BO(Business Object):业务对象,封装业务逻辑和业务数据。
  • VO(View Object):视图对象,用于展示层,通常包含从多个DO或DTO组合的数据。

领域模型命名规约

领域模型的命名规约是软件开发中用于保持代码清晰和一致性的一种实践。以下是对您提供的命名规约的扩展说明:

数据对象(Data Object, DO)

  • 命名规约:通常以xxxDO命名,其中xxx代表数据表的名称。
  • 用途:DO通常直接映射到数据库表,包含与表字段对应的属性和基本的数据操作方法。

数据传输对象(Data Transfer Object, DTO)

  • 命名规约:以xxxDTO命名,其中xxx代表业务领域相关的名称。
  • 用途:DTO用于在应用程序的不同层之间传输数据,特别是在服务层和表示层之间。它们通常包含业务逻辑所需的数据,但不包含数据访问逻辑。

请求对象(Request Object)

  • 命名规约:接收前端JSON对象请求的类命名为XXXReq,其中XXX代表请求所关联的业务领域或操作。
  • 用途:这些对象通常用于封装从前端接收的请求数据,方便在后端进行处理。

SpringBeanUtil代码实现


public class SpringBeanUtil {/*** 把源对象的属性值复制到目标对象中。* 该方法通过反射创建目标对象的实例,并使用BeanUtils的copyProperties方法将源对象的属性值复制到新创建的目标对象中。* 这样做的目的是为了在不改变原有对象的情况下,创建一个具有相同属性值的新对象。** @param source 源对象,其属性值将被复制。* @param target 目标对象的Class,用于创建新对象并复制属性值。* @param <T>    目标对象的类型参数。* @return 新创建的并已填充了属性值的目标对象。* @throws RuntimeException 如果在创建目标对象实例或复制属性过程中发生异常。*/public static <T> T copyProperties(Object source, Class<T> target) {try {// 通过反射无参构造方法创建目标对象的实例T t = target.getConstructor().newInstance();// 使用BeanUtils的copyProperties方法复制源对象的属性到目标对象BeanUtils.copyProperties(source, t);return t;} catch (Exception e) {// 捕获并抛出运行时异常,以方便调用方处理异常情况throw new RuntimeException(e);}}/*** 复制属性值到新的对象列表。* 该方法通过遍历源对象列表,将每个源对象的属性值复制到新建的目标对象中,然后将这些目标对象添加到一个新的列表中返回。* 这种方式适用于需要根据已有对象列表创建一个新的具有相同属性的对象列表的场景。** @param sourceList 源对象列表,可以包含任意类型的对象。* @param target 目标对象的类类型,用于创建新的目标对象。* @param <T> 目标对象的类型参数。* @return 包含复制了属性值的新对象的列表。*/public static <T> List<T> copyProperties(List<?> sourceList, Class<T> target) {// 初始化目标对象列表ArrayList<T> targetList = new ArrayList<>();// 遍历源对象列表,对每个源对象进行属性复制操作sourceList.forEach(item -> targetList.add(copyProperties(item, target)));// 返回包含复制了属性值的新对象的列表return targetList;}}

这段代码定义了一个名为 SpringBeanUtil 的工具类,它提供了两个静态方法来复制对象属性值。以下是对这两个方法的详细解释:

方法一:copyProperties(Object source, Class<T> target)

目的:创建一个新的目标对象,并将其属性值从源对象复制过来。

步骤

  1. 创建目标对象实例:使用Java反射API,调用目标类 target 的无参构造函数来创建一个新的实例 T t
  2. 复制属性:使用 BeanUtils.copyProperties 方法将源对象 source 的属性值复制到新创建的目标对象 t 中。
  3. 异常处理:如果在创建实例或复制属性过程中发生异常,捕获这些异常并抛出一个新的 RuntimeException

返回值:返回新创建的并已填充了属性值的目标对象。

使用场景:当你需要从现有的对象创建一个新的对象,并且希望新对象具有与原对象相同的属性值时,这个方法非常有用。例如,你可能需要在不同的业务逻辑中使用相同的数据,但又不想改变原始对象。

方法二:copyProperties(List<?> sourceList, Class<T> target)

目的:复制一个对象列表中的每个对象的属性到新的对象列表中。

步骤

  1. 初始化目标列表:创建一个新的 ArrayList<T> 来存储复制后的对象。
  2. 遍历源列表:使用Java 8的 forEach 循环遍历源对象列表 sourceList
  3. 复制单个对象:对于列表中的每个源对象 item,调用第一个 copyProperties 方法来创建一个新的目标对象,并将其添加到目标列表 targetList 中。
  4. 返回结果:返回包含所有新创建对象的目标列表。

返回值:返回一个新的列表,其中包含了源列表中每个对象属性值复制后的新对象。

使用场景:当你有一个对象列表,并且需要根据这个列表创建一个新的对象列表,同时保持原有属性值不变时,这个方法非常有用。例如,在数据传输或在不同服务层之间传递数据时,可能需要这样的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/45037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TS-类型别名和接口的区别

TypeScript中的类型别名&#xff08;Type Alias&#xff09; 和 接口&#xff08;Interface&#xff09; 都是用来自定义类型的工具&#xff0c;但他们在语法和使用场景上有一些区别。 扩展和合并 类型别名&#xff1a;不能直接扩展和合并&#xff0c;但可以通过交叉类型来实现…

2024年了还在学pytestday1

1、按照博主的说法&#xff0c;提出疑问&#xff1a;应该在电脑本地终端安装还是在pythoncharm终端安装&#xff1f; ------在pythoncharm终端安装就行 避免老是忘记&#xff0c;还是记下来比较好。 2、在公司安装不成功&#xff0c;换豆瓣源也不行&#xff0c;连接手机热点尝…

LangChain 语言 —— LCEL

文章目录 一、概述二、快速开始1、invoke 一个 runable2、batch 一个 runable3、stream 一个 runable4、将runables组合起来5、并行调用可运行文件6、将任何function转换为可runable7、合并输入和输出字典8、将输入字典包含在输出字典中9、添加默认调用参数 一、概述 LangChain…

华为机考真题 -- 靠谱的车

题目描述: 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。出租车司机解释说他不喜欢数字 4,所以改装了计费表,任何数字位置遇到数字 4 就直接跳过,其余功能都正常。 比如: 1. 23 再多一块钱就变为 25; 2. 39 再多一块钱…

大象资讯 | IvorySQL 3.3 发版

IvorySQL 3.3 于 2024.07.11 日发版&#xff0c;该版本基于 PostgreSQL 16.3&#xff0c;修复若干问题。 IvorySQL 是一款以 PostgreSQL 为基础进行开发&#xff0c;并且兼容 Oracle 的开源数据库。该项目是在 Apache 2.0 许可证下发布的&#xff0c;社区鼓励且欢迎所有类型的贡…

Linux--安装VMware步骤

安装VMware VMware Desktop Hypervisors for Windows, Linux, and Mac 复制链接打开浏览器下载即可 从官网下载软件&#xff0c;完成后为确保后续正常使用&#xff0c;需要检查虚拟网卡是否安装完成 检查虚拟网卡的安装步骤 Windows--设置--高级设置--网络适配器--看是否有显…

STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)

一、设计描述 本设计精心构建了一个以STM32MP157A高性能单片机为核心控制单元的综合性嵌入式系统。该系统巧妙融合了蜂鸣器、数码管显示器、点阵屏、温湿度传感器、LED指示灯以及按键等多种外设模块&#xff0c;形成了一个功能丰富、操作便捷的杂交版智能设备。通过串口…

vue2学习笔记-官网使用指南和搭建开发环境

官网使用指南 官网地址&#xff1a;介绍 — Vue.js 1、学习 1.1 教程和API 最重要的两个板块。API是VUE的字典&#xff0c;需要时来查阅。 1.2、风格指南 如何写出风格优雅的VUE代码。规则分为四类&#xff1a;必要的&#xff0c;强烈推荐、推荐、谨慎使用。 1.3、示例 …

初始网络知识

前言&#x1f440;~ 上一章我们介绍了使用java代码操作文件&#xff0c;今天我们来聊聊网络的一些基础知识点&#xff0c;以便后续更深入的了解网络 网络 局域网&#xff08;LAN&#xff09; 广域网&#xff08;WAN&#xff09; 路由器 交换机 网络通信基础 IP地址 端…

PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0

符合条件的 PCI SSC 利益相关者在 30 天的意见征询 (RFC) 期间审查 PCI PTS 硬件安全模块 (HSM) 模块化安全要求 v5.0 草案并提供反馈。 PCI PTS 硬件安全模块(HSM)模块化安全要求 v5.0图 从 7 月 8 日到 8 月 8 日&#xff0c;邀请符合条件的 PCI SSC 利益相关者在 30 天的意见…

【linux】服务器创建RAID1(软件配置RAID1)

【linux】服务器创建RAID1(软件配置RAID1) 文章目录 【linux】服务器创建RAID1(软件配置RAID1)一、配置介绍raid介绍raid类型RAID 0:RAID 1:RAID 5:RAID 6:二、配置RAID硬件RAID:软件RAID:三、软件配置RAID1(以linux为例)1.先进入管理员模式2.安装mdadm工具3.创建raid1数…

SSH服务器CBC漏洞(CVE-2008-5161)

漏洞简介 OpenSSH 是一种开放源代码的SSH协议的实现,初始版本用于OpenBSD平台,现在已经被移植到多种Unix/Linux类操作系统下,Linux环境中一般采用AES这种算法加密,AES有五种加密模式(CBC、ECB、CTR、OCF、CFB),系统默认会选择CBC的加密模式。 CBC模式是一种常用的对称…

存取款系统接口设计

题目描述&#xff1a; 设计一个存取款接口&#xff0c;入参是账户数组balances 与存取款请求体数组requests 对于取款要求判断&#xff1a; 当前余额不足&#xff0c;返回余额不足帐号 之前的取款时间在24之前的&#xff0c;在24小时之后返回上次取款额度的百分之2并向下取整。…

Hive期末测试题(头歌)

第1关&#xff1a;计算“Bad Boys (1995)”这部电影的评分次数 -- 使用mydb数据库 USE mydb;-- 计算“Bad Boys (1995)”这部电影的评分次数 SELECT m.movieid, m.moviename, COUNT(r.movieid) AS rating_count FROM t_movies m JOIN t_ratings r ON m.movieid r.movieid WHE…

【欧几里得算法】C++求解最大公因子:求解两个正整数的最大公因子

1. 算法描述&#xff1a; 【欧几里得算法】求解两个正整数m&#xff0c;n的最大公因子 2. 算法求解步骤&#xff1a; E1&#xff08;求两个整数的余数&#xff09;&#xff1a;求两个正整数的余数&#xff0c;r m % nE2&#xff08;判断余数是否为0&#xff09;&#xff1a…

遥感影像图像识别

遥感影像图像识别 基于遥感影像的道路提取论文、开源代码和数据集汇总

C语言 结构体和共用体——结构体所占内存的字节数

目录 结构体所占内存的字节数 结构体所占内存的字节数

Unity之OpenXR+XR Interaction Toolkit实现 Gaze眼部追踪

使用 Unity OpenXR 实现Gaze眼部追踪 在虚拟现实(VR)和增强现实(AR)应用中,眼动追踪是一项强大而受欢迎的技术。它可以让开发者更好地理解用户的注意力和行为,并创造出更加沉浸和智能的体验。在本文中,我们将探讨如何使用 Unity OpenXR 实现Gaze眼部追踪功能。 Unity …

Linux文件:EXT2文件系统工作原理 软硬链接

Linux文件&#xff1a;文件系统究竟是什么&#xff1f;如何管理文件&#xff1f; 前言一、磁盘结构、存储策略1.1 磁盘存储结构1.2 磁盘存储策略1.3 磁盘的逻辑存储结构 二、如何管理磁盘文件三、如何管理组3.1 每个组保存的数据种类3.2 如何管理数据1、节点表&#xff08;inod…

科普文:Shell编程三剑客:grep+sed+awk

shell三剑客是grep、sed和awk三个工具的简称,因功能强大&#xff0c;使用方便且使用频率高&#xff0c;因此被戏称为三剑客&#xff0c;熟练使用这三个工具可以极大地提升运维效率。 三剑客的特点: 命令 特点 使用场景 grep 擅长查找过滤 快速查找过滤 sed 擅长取行和替…