• bean复制映射工具包mapstruct


    简介

    工作中经常会用到对象复制,属性覆盖等操作,除了常见的BeanUtil外,还有一个好用的编程式工具类mapstruct。

    依赖

    <dependency>
         <groupId>org.mapstructgroupId>
         <artifactId>mapstruct-jdk8artifactId>
         <version>1.1.0.Finalversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    使用demo

    get和set用lombok自动生成了

    @Data
    public class Student {
        private Integer id;
        private String name;
        private Integer age;
        private String sex;
    }
    
    @Data
    public class User {
        private Integer id;
        private String name;
        private Integer age;
        private String sex; 
    }
    
    
    import org.mapstruct.Mapper;
    import org.mapstruct.Mappings;
    
    @Mapper
    public interface UserMapping {
    
    	UserMapping instance = Mappers.get(UserMapping.class)
    
    
        /**
         * Student 转化为 User
         * @param Student
         * @return
         */
         User studentToUser(Student student);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在maven编译之后就可以看到在编译包中自动实现了对象复制

    属性覆盖

    也是差不多的操作,@MappingTarget指定被覆盖属性的目标对象

    void studentToUser(@MappingTarget User user, Student student);
    
    • 1

    属性覆盖/转换

    属性转换,这里以liststring互转为例

    在这里插入图片描述

    在build编译之后看到自动引用了类型转换的方法

    在这里插入图片描述

    也可以使用@Named注解指定转换的方法

    @Mapper
    public interface StudentMapper {
        StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);
    
        @Mappings({
                @Mapping(source = "name1", target = "name2",defaultValue = "某某人"),
                @Mapping(target = "age2", expression = "java(java.lang.Integer.valueOf(student1.getAge1()))"),
                @Mapping(source = "createTime1", target = "createTime2", dateFormat = "yyyy-MM-dd HH:mm:ss:SSS"),
                @Mapping(source = "weight1", target = "weight2", numberFormat = "0.00"),
                @Mapping(target = "bloodType2", constant = "A 型血"),
                @Mapping(source = "sex1",target = "sex2",qualifiedByName = {"getBySexEnum"})
        })
        Student2 toStudent2(Student1 student1);
    
        @InheritConfiguration(name = "toStudent2")
        void updateStudent2(Student1 student1, @MappingTarget Student2 student2);
    
        @Named("getBySexEnum")
        default Integer getBySexEnum(SexEnum sexEnum){
            return sexEnum.getCode();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    指定null值时的策略

    方法层级

    @org.mapstruct.BeanMapping.BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
    void xxxxx(@MappingTarget xxxxx target, xxxxx updateData);
    
    • 1
    • 2

    class下全局

    @Mapper(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
    public interface xxxxx{
    xxxx
    }
    
    • 1
    • 2
    • 3
    • 4

    List转换指定单个元素转换方法

    @IterableMapping(qualifiedByName = "cvtAddEntity")
    List<xxx> cvtAddEntityList(List<xxx> discountDetailList);
    
    
    @Named("cvtAddEntity")
    @Mappings({
            @Mapping(target = "id", ignore = true)
    })
    xxx cvtAddEntity(xxx discountDetail);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    参考了文章
    https://www.cnblogs.com/DDgougou/p/13365277.html

  • 相关阅读:
    指挥中心实战指挥平台-通信指挥类装备多链路聚合设备解决方案实例
    C#递归处理树菜单
    [附源码]计算机毕业设计病人跟踪治疗信息管理系统Springboot程序
    【疯狂世界杯】css 动画实现跳动的足球
    【强化学习】TensorFlow2实现DQN(处理CartPole问题)
    LINQ to SQL (Group By/Having/Count/Sum/Min/Max/Avg操作符)
    dubbo和springcloud问题解决——interface not allow null
    【组成原理-数据】浮点数的编码与运算
    PACS(Picture Archiving and Communications System)图像存储与传输系统源码
    肖sir__mysql之单表__004
  • 原文地址:https://blog.csdn.net/weixin_43944305/article/details/128182957