类型映射工具MapStruct

前言

比较常用的几种JavaBean类型转换方式

  1. 手动转换 get、set 缺点:开发效率低
  2. json 效率低、不同属性名,复杂类型映射复杂
  3. 反射 性能低
  4. 字节码增强


几种转换工具的性能对比

在这里插入图片描述

简介

MapStruct是一个只需要定义接口、写少量注解就能实现两个不通类型之间的转换的工具,在编译期根据定义生成映射代码,生成的映射代码使用普通的方法调用,因此它非常快,且易懂,易Debug,支持Maven, Gradle等构建工具,且支持常用IDE。
总结:性能高、易懂、支持性好、易调试

使用

        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.4.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.4.2.Final</version>
        </dependency>

**注:**在和Lombok1.18.16+共存时,需要加build插件指定Processor的顺序

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>1.18.16</version>
                        </path>
                        <!-- This is needed when using Lombok 1.18.16 and above -->
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok-mapstruct-binding</artifactId>
                            <version>0.2.0</version>
                        </path>
                        <!-- Mapstruct should follow the lombok path(s) -->
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>1.4.2.Final</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>

实战

  1. 简单示例
  2. 自定义属性映射关系
    /**
     * 不同属性名映射
     * @param userDTO1
     * @return
     */
    @Mapping(target = "name",source = "userName")
    User map2(UserDTO1 userDTO1);
  1. 时间、数字与字符串之间的转换以及格式化
    /**
     * 浮点数格式化
     * @param userDTO1
     * @return
     */
    @Mapping(target = "tall",numberFormat = "0.00")
    User map3(UserDTO1 userDTO1);
    /**
     * 日期格式化
     * @param userDTO1
     * @return
     */
    @Mapping(target = "birthday",dateFormat = "yyyy-mm-dd HH:mm:ss")
    User map4(UserDTO1 userDTO1);
  1. 多级嵌套、集合类型转换
    /**
     * 多层嵌套
     * @param userDTO1
     * @return
     */    
    @Mapping(target = "school.name",source = "schoolName")
    User map5(UserDTO1 userDTO1);
    /**
     * 集合转换
     * @param userDTO1s
     * @return
     */
    List<User> userList2DtoList(List<UserDTO1> userDTO1s);
  1. 逆向转换
    /**
     * 逆向映射
     * @param user
     * @return
     */
    @InheritInverseConfiguration(name = "map5")
    UserDTO1 map6(User user);
  1. 多转一
    /**
     * 多转一
     * @param school
     * @return
     */    
Student map8(User user,School school);
  1. 表达式
    /**
     * 表达式
     * @param user
     * @return
     */
    @Mapping(target = "age",expression = "java(user.parseAge())")
    UserDTO1 map9(User user);
  1. 复杂类型自定义转换
    /**
     * 复杂类型转换
     */
    default UserDTO1 user2UserDto(User user){
        UserDTO1 userDTO1 = new UserDTO1();
        userDTO1.setId(user.getId().toString());
        return userDTO1;
    }
  1. 更新对象
    /**
     * 更新已有对象
     */
    void update(School school,@MappingTarget User user);
  1. 通过uses引入外部转换
@Mapper(uses = DateUtil.class)

动态编译

JavaCompiler
AbstractProcessor#process

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值