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


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

    在开发过程中遇到这样一个问题:多个对象实体间要进行对象拷贝,并且对象里面还包含别的对象集合,对象名字也不同,但是里面的字段是一样的,使用普通的方式拷贝,发现只是进行了浅拷贝,里面的对象没有拷贝到。最后使用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、引入相关依赖:
    1. <dependency>
    2. <groupId>org.mapstructgroupId>
    3. <artifactId>mapstructartifactId>
    4. dependency>
    5. <dependency>
    6. <groupId>org.mapstructgroupId>
    7. <artifactId>mapstruct-processorartifactId>
    8. dependency>
    2、写几个要映射的对象:
    1. //返给前端的对象
    2. public class UserVO {
    3. private Integer id;
    4. private String nickName;
    5. private Integer age;
    6. private List dogs;
    7. }
    8. public class DogVO {
    9. private String name;
    10. private String color;
    11. }
    1. //后端交互的对象
    2. public class User {
    3. private Integer id;
    4. private String name;
    5. private Integer age;
    6. private List dogList;
    7. }
    8. public class Dog {
    9. private String name;
    10. private String col;
    11. }
    3、定义一个映射器:
    1. import org.mapstruct.Mapper;
    2. import org.mapstruct.Mapping;
    3. import org.mapstruct.Mappings;
    4. import org.mapstruct.factory.Mappers;
    5. /**
    6. * @author
    7. * @description: 定义一个映射器
    8. * @version: 1.0
    9. */
    10. @Mapper
    11. public interface UserMapper {
    12. UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);
    13. /**
    14. * User的映射
    15. */
    16. @Mappings({@Mapping(source = "dogList",target = "dogs"),@Mapping(source = "name",target = "nickName")})
    17. UserVO userToUserVO(User user);
    18. /**
    19. * Dog的映射
    20. */
    21. @Mapping(source = "col",target = "color")
    22. DogVO dogToDogVO(Dog dog);
    23. }
    4、测试代码:
    1. public static void main(String[] args) {
    2. ArrayList dogs = new ArrayList<>();
    3. Dog dog = new Dog("小蓝","蓝色");
    4. Dog dog1 = new Dog("小黑","黑色");
    5. Dog dog2 = new Dog("小绿","绿色");
    6. dogs.add(dog2);
    7. dogs.add(dog1);
    8. dogs.add(dog);
    9. User user = new User();
    10. user.setId(1);
    11. user.setAge(18);
    12. user.setName("Test");
    13. user.setDogList(dogs);
    14. UserVO userVO = UserMapper.INSTANCE.userToUserVO(user);
    15. System.out.println(userVO.toString());
    16. }
    5、输出结果:

  • 相关阅读:
    Boost Arm 交叉编译
    Swift新async/await并发模型中子任务取消不能被其它子任务感知的原因及解决
    Android源码相关面试专题
    HBASE知识点
    Vue13 监视属性
    3D体验平台品牌应用——ENOVIA
    uni-app 中的 picker 组件基于后台对象数组数据格式的使用
    一个用于在虚拟桌面下跑chrome的docker镜像
    TCP/IP网络江湖——江湖导航(网络层上篇)
    JS进阶第二篇:函数参数按值传递
  • 原文地址:https://blog.csdn.net/l_s_r/article/details/134008741