java对象深拷贝(Mapstruct)代码实现

news2025/1/12 20:00:03

这几天写的需求正在提测中,所以比较有空闲时间,正好来总结一下开发中遇到的问题并记录一下。

在开发过程中遇到这样一个问题:多个对象实体间要进行对象拷贝,并且对象里面还包含别的对象集合,对象名字也不同,但是里面的字段是一样的,使用普通的方式拷贝,发现只是进行了浅拷贝,里面的对象没有拷贝到。最后使用MapStruct方法完美解决,主要原因:拷贝速度快,支持深拷贝。

本文只教简单实现深拷贝,如果想学习更深的知识就去官网查看。。

MapStruct官网:https://mapstruct.org/

使用方法:

1.新建XXMapper,接口或抽象类 (比如:UserMapper)

2.加上注解 @Mapper (注意引入的import包:org.mapstruct.xxxx)

3.创建转换方法 (如下图代码方法userToUserVO(User user))

4.在方法上添加@Mapping(source="源对象:这里就是是User中的属性",target = "目标对象:这里就是UserVO的属性")

        如下图,user.name 要转成 userVO.nikeName

5.若有多个属性不同,可用@Mappings

代码示例:

1、引入相关依赖:
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct</artifactId>
</dependency>
<dependency>
    <groupId>org.mapstruct</groupId>
    <artifactId>mapstruct-processor</artifactId>
</dependency>
2、写几个要映射的对象:
//返给前端的对象
public class UserVO {
    private Integer id;
    private String nickName;
    private Integer age;

    private List<DogVO> dogs;
}


public class DogVO {
    private String name;
    private String color;
}
//后端交互的对象
public class User {
    private Integer id;
    private String name;
    private Integer age;

    private List<Dog> dogList;
}


public class Dog {
    private String name;
    private String col;
}
3、定义一个映射器:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;

/**
 * @author 
 * @description: 定义一个映射器
 * @version: 1.0
 */
@Mapper
public interface UserMapper {

    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    /**
     * User的映射
     */
    @Mappings({@Mapping(source = "dogList",target = "dogs"),@Mapping(source = "name",target = "nickName")})
    UserVO userToUserVO(User user);

    /**
     * Dog的映射
     */
    @Mapping(source = "col",target = "color")
    DogVO dogToDogVO(Dog dog);

}
4、测试代码:
 public static void main(String[] args) {
        ArrayList<Dog> dogs = new ArrayList<>();
        Dog dog = new Dog("小蓝","蓝色");
        Dog dog1 = new Dog("小黑","黑色");
        Dog dog2 = new Dog("小绿","绿色");
        dogs.add(dog2);
        dogs.add(dog1);
        dogs.add(dog);
        User user = new User();
        user.setId(1);
        user.setAge(18);
        user.setName("Test");
        user.setDogList(dogs);
        UserVO userVO = UserMapper.INSTANCE.userToUserVO(user);
        System.out.println(userVO.toString());
    }
5、输出结果:

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

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

相关文章

那些只要一两行代码就能搞定的Python操作

Python是一种简洁、易读且功能强大的编程语言&#xff0c;有很多操作只需要一行代码就能完成。本文将介绍一些常用的单行代码操作&#xff0c;并分析其技术原理&#xff0c;让读者更深入地理解Python的简洁与高效。 1、列表推导式 列表推导式是Python中一种简洁的构造列表的方法…

STM32:外部中断

中断&#xff0c;顾名思义就是停止现在正在干的活&#xff0c;去干其他更紧急的事情。在通常的信息系统中&#xff0c;中断发生时&#xff0c;会先保留现场&#xff0c;即当前的运行情况和状态。在去做其他紧急事情。事情做完还要恢复原先中断前的状态继续干原来的活。在STM32中…

python 字典dict和列表list的读取速度问题, range合并

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 python 字典和列表的读取速度问题 最近在进行基因组数据处理的时候&#xff0c;需要读取较大数据&#xff08;2.7G&#xff09;存入字典中&#xff0c; 然后对被处理数据进行字典key值的匹配&#xff0c;在被处理文件中每次…

模拟开关与多路复用器

模拟开关 模拟开关现在有两种工艺&#xff0c;模拟开关与cmos工艺 CMOS模拟开关收到温度还有供电电压影响&#xff0c;尽量供电高一点 jfet断电导通&#xff0c;cmos断电断开 因为寄生电容&#xff0c;交流信号会漏过模拟开关 没有负电源脚不能传交流电&#xff0c…

windows安装docker,解决require wsl 2问题

想在windows上安装桌面版docker&#xff0c;上官网下载了安装包&#xff0c;安装完后&#xff0c;启动报错&#xff0c;忘了截图了。 大概意思就是require wsl 2。 于是就是docker FAQ中找相关问题解决方案&#xff0c;点&#xff0c;点&#xff0c;点然后就点到微软了。 ws…

重入漏洞EtherStore

重入漏洞 // SPDX-License-Identifier: MIT pragma solidity ^0.8.13;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;}function withdraw() public {uint bal balances[msg.sender]…

干货分享 | TSMaster几种过滤器的对比及使用

TSMaster的4种过滤器&#xff1a; //硬件过滤器&#xff1a;可以在硬件端针对数据位进行筛选过滤&#xff0c;硬件过滤。在硬件端阻止接收一部分不需要的报文&#xff0c;留更多带宽对其他报文进行接收。 // 数据流过滤器&#xff1a;过滤总线数据流&#xff0c;软件过滤。操…

A股风格因子看板 (2023.10 第11期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第11期&#xff0c;指数组合数据截止日2023-09-30&#xff0c;要点如下 近1年A股风格因子检验统…

gin框架初识

先引入gin的包 终端执行 go get -u github.com/gin-gonic/gin 代码 package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default() //默认的路由引擎r.GET("/book", func(c *gin.Context) {c.JSON(http.Statu…

muduo源码学习base——Exception(带 stack trace 的异常基类)

Exception(带 stack trace 的异常基类&#xff09; 前置ExceptionCurrentThread::stackTrace() 前置 ABI: Application Binary Interface&#xff0c;应用程序二进制接口&#xff0c;可以参考&#xff1a;细谈ABI RTTI type_info: RTTI&#xff1a;Run Time Type Identificatio…

js给一段话,遇到的第一个括号处加上换行符

list.forEach((item,index0)>{const productName item.name;const index productName.indexOf(&#xff08;);if (index -1) {return productName;}const before productName.slice(0, index);const after productName.slice(index);item.namebefore \n after;});

算法学习(七)判断一个二叉树是否为完全二叉树

描述 给定一个二叉树&#xff0c;确定他是否是一个完全二叉树。 完全二叉树的定义&#xff1a;若二叉树的深度为 h&#xff0c;除第 h 层外&#xff0c;其它各层的结点数都达到最大个数&#xff0c;第 h 层所有的叶子结点都连续集中在最左边&#xff0c;这就是完全二叉树。&a…

值改变事件(SMART PLC梯形图FC)

值改变事件在通信速度优化上的应用,请查看下面文章链接: C#winform事件驱动 值改变事件 PLC寄存器值改变_plc数据变化触发条件_RXXW_Dor的博客-CSDN博客Modbus通讯时,设置值发生改变时,我们希望启动一次请求帧,发送写数据帧,这个功能,在C#winform里很容易实现,因为有对…

“唯品会VIP商品搜索API:尊享购物体验,一键获取心仪商品!“

唯品会按关键字搜索VIP商品API是一项面向唯品会VIP用户的API服务&#xff0c;它主要用于在唯品会网站上根据用户指定的关键字快速搜索到VIP商品&#xff0c;并提供商品详情、价格、库存量、评价等信息。这个API的核心功能是为用户提供便捷且准确的搜索服务&#xff0c;让用户能…

探索二次开发途径

一、什么是二次开发&#xff1f; 软件二次开发&#xff0c;也被称为定制开发或应用开发&#xff0c;是指在已有的软件基础上&#xff0c;通过编写自定义代码或应用程序来满足特定需求&#xff0c;扩展现有软件的功能。这种方式可在满足定制需求的同时&#xff0c;减少了开发新…

【会议征稿通知】第二届语言与文化传播国际学术会议(ICLCC 2024)

第二届语言与文化传播国际学术会议&#xff08;ICLCC 2024&#xff09; The 2nd International Conference on Language and Cultural Communication 第二届语言与文化传播国际学术会议&#xff08;ICLCC 2024&#xff09;的目标是将语言与文化传播领域的创新学者和行业专家聚…

利用ChatGPT自动生成基于PO的数据驱动测试框架

简介 PO&#xff08;PageObject&#xff09;设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类&#xff0c;并以页面为单位来写测试用例&#xff0c;实现页面对象和测试用例的分离。 数据驱动测试&#xff08;DDT&#xff09;是一种方法&#xff0c…

有奖招募——2023年度清华社“荐书官”活动今日开始了!

又到“1024程序员节”了&#xff0c;维护网络世界稳定和平的程序员大大们&#xff0c;辛苦了&#xff01;生活难免有bug&#xff0c;来给彼此个hug~ 过完1024&#xff0c;这一年也快要结束了&#xff0c;岁末回顾又要提上日程。很多人都有整理年度书单的习惯&#xff0c;那么这…

服务器数据恢复-服务器系统损坏启动蓝屏的数据恢复案例

服务器故障&分析&#xff1a; 某公司一台华为机架式服务器&#xff0c;运行过程中突然蓝屏。管理员将服务器进行了重启&#xff0c;但是服务器操作系统仍然进入蓝屏状态。 导致服务器蓝屏的原因非常多&#xff0c;比较常见的有&#xff1a;显卡/内存/cpu或者其他板卡接触不…

基于SSM的流浪动物领养信息系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…