开发利器mapstruct

Posted 雪浪snowWave

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发利器mapstruct相关的知识,希望对你有一定的参考价值。

背景:

       在业务代码中,会出现很多dto之间的相互转换,就是两个dto属性的各种get,set,会造成大量的冗余代码,所以出现了一些工具,比如Spring中的beanUtil,但是beanutil是运行时处理的,性能较差,所以出现了一款利器,mapstruct,它是编译生效的,类似lombok,所以性能大大提升

 

maven导入:

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

建立两个类,一个UserEntity,一个UserDTO

@Data
public class UserEntity {
    private String name;
    private String password;
    private Integer age;
    private Date birthday;
    private String sex;
}
@Data
public class UserVO {
    private String name;
    private String age;
    private String birthday;
    private String gender;
}

接下来是关键的映射,UserMapper接口

@Mapper
public interface UserMapper {

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

    /**
     * 1、entity与vo中属性名相同时候默认映射,(比如name),属性名相同属性类型不同也会映射,(比如birthday,一个Data,一个String)
     * 2、entity与vo中属性名不同的,需要通过@Mapping明确关系来形成映射(如sex对应gender)
     * 3、无映射关系属性被忽略(如UserEntity的password)
     */
    @Mappings({
            @Mapping(target = "gender", source = "sex"),    
    })
    UserVO entityToVO(UserEntity entity);

}

测试代码

public class UserTest {

    public static void main(String[] args)  {
        UserEntity userEntity = new UserEntity();
        userEntity.setAge(1);
        userEntity.setName("snow");
        userEntity.setPassword("123");
        userEntity.setSex("");
        userEntity.setBirthday(new Date());

        UserVO userVO = UserMapper.INSTANCE.entityToVO(userEntity);
        System.out.println(userVO);
        System.out.println("=================");
        System.out.println(userEntity);

    }
}

结果如下:

UserVO(name=snow, age=1, birthday=18-5-11 下午9:23, gender=男)
=================
UserEntity(name=snow, password=123, age=1, birthday=Fri May 11 21:23:34 CST 2018, sex=男)

以上是简单举例,参考https://blog.csdn.net/OO570741825/article/details/78530022,在它基础上做了些修正

 

以上是关于开发利器mapstruct的主要内容,如果未能解决你的问题,请参考以下文章

秒懂Java之实体转化利器MapStruct详解

秒懂Java之实体转化利器MapStruct详解

MapStruct代码生成器实现对象转换

优雅的转换Bean对象 mapstruct使用笔记详解

MapStruct类型之间映射的实现

MapStruct类型之间映射的实现