Spring Boot MapStruct

Posted

tags:

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

参考技术A Spring Boot MapStruct 是什么

在一个成熟的工程中,尤其是现在的分布式系统中,应用与应用之间,还有单独的应用细分模块之后,DO 一般不会让外部依赖,这时候需要在提供对外接口的模块里放 DTO 用于对象传输,也即是 DO 对象对内,DTO对象对外,DTO 可以根据业务需要变更,并不需要映射 DO 的全部属性。

这种 对象与对象之间的互相转换,就需要有一个专门用来解决转换问题的工具,毕竟每一个字段都 get/set 会很麻烦。

MapStruct 就是这样的一个属性映射工具,只需要定义一个 Mapper 接口,MapStruct 就会自动实现这个映射接口,避免了复杂繁琐的映射实现。MapStruct官网地址: mapstruct.org/

Maven 的配置
pom.xml

写转换关系

开发利器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,在它基础上做了些修正

 

以上是关于Spring Boot MapStruct的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》

spring-boot-quartz, 依赖spring-boot-parent

spring-boot系列:初试spring-boot

Spring Boot:Spring Boot启动原理分析

Spring Boot:Spring Boot启动原理分析