JavaBean类型映射简化 MapStruct


它是什么?

MapStruct 是一个代码生成器,它基于约定优于配置方法极大地简化了 Java bean 类型之间映射的实现。

生成的映射代码使用简单的方法调用,因此速度快、类型安全且易于理解。

为什么使用?

多层应用程序通常需要在不同的对象模型(例如实体和 DTO)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct 旨在通过尽可能自动化来简化这项工作。

与其他映射框架相比,MapStruct 在编译时生成 bean 映射,以确保高性能,允许快速的开发人员反馈和彻底的错误检查。

如何使用?

MapStruct 是一个注解处理器,它插入到 Java 编译器中,可用于命令行构建(Maven、Gradle 等)以及您首选的 IDE。

MapStruct 使用合理的默认值,但在配置或实现特殊行为时会避开您的方式。

一、添加POM文件
    <properties>
        <mapstruct.version>1.4.1.Finalmapstruct.version>
    properties>
...
...
...
    <dependencies>
        <dependency>
            <groupId>org.mapstructgroupId>
            <artifactId>mapstructartifactId>
            <version>${mapstruct.version}version>
        dependency>
        <dependency>
            <groupId>org.mapstructgroupId>
            <artifactId>mapstruct-jdk8artifactId>
            <version>${mapstruct.version}version>
        dependency>
dependencies>

另外 本次还使用了lombok 、junit:

       <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <version>1.18.22version>
        dependency>
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.12version>
        dependency>

maven构建配置:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <version>2.1.1.RELEASEversion>
            plugin>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.8.1version>
                <configuration>
                    <source>8source>
                    <target>8target>
                    <encoding>UTF-8encoding>
                    <annotationProcessorPaths>
                        
                        <path>
                            <groupId>org.mapstructgroupId>
                            <artifactId>mapstruct-processorartifactId>
                            <version>${mapstruct.version}version>
                        path>
                        <path>
                            <groupId>org.projectlombokgroupId>
                            <artifactId>lombokartifactId>
                            <version>1.18.22version>
                        path>
                        <path>
                            <groupId>org.projectlombokgroupId>
                            <artifactId>lombok-mapstruct-bindingartifactId>
                            <version>0.2.0version>
                        path>
                    annotationProcessorPaths>
                configuration>
            plugin>
        plugins>
    build>

增加实体类

/**
 * 人员
 */
@Data
@AllArgsConstructor
public class Person {
    private Integer age;
    private String name;
    private Address address;
}
/**
 * 地址
 */
@Data
@AllArgsConstructor
public class Address {
    private String name;
}
/**
 * 人员dto
 */
@Data
public class PersonDTO {
    private Integer personAge;
    private String personName;
    private AddressDTO address;
}
/**
 * 地址dto
 */
@Data
public class AddressDTO {
    private String addressName;
}

建立映射[接口]

@Mapper
public interface MapStructMap {

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

    @Mapping(source = "age",target = "personAge")
    @Mapping(source = "name",target = "personName")
    PersonDTO personToPersonDto(Person person);


    @Mapping(source = "name",target = "addressName")
    AddressDTO addressToAddressDto(Address address);
}

测试

    @Test
    public void MTest(){
        Person person = new Person(18,"张三",new Address("北京天安门"));

        PersonDTO personDTO = MapStructMap.INSTANCE.personToPersonDto(person);

        System.out.println(personDTO);
        //PersonDTO(personAge=18, personName=张三, address=AddressDTO(addressName=北京天安门))
    }

上面只定义了接口,编译后会发现自动生成[实现]了,自动生成代码如下:

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2021-12-31T15:43:10+0800",
    comments = "version: 1.4.1.Final, compiler: javac, environment: Java 1.8.0_181 (Oracle Corporation)"
)
public class MapStructMapImpl implements MapStructMap {

    @Override
    public PersonDTO personToPersonDto(Person person) {
        if ( person == null ) {
            return null;
        }

        PersonDTO personDTO = new PersonDTO();

        personDTO.setPersonAge( person.getAge() );
        personDTO.setPersonName( person.getName() );
        personDTO.setAddress( addressToAddressDto( person.getAddress() ) );

        return personDTO;
    }

    @Override
    public AddressDTO addressToAddressDto(Address address) {
        if ( address == null ) {
            return null;
        }

        AddressDTO addressDTO = new AddressDTO();

        addressDTO.setAddressName( address.getName() );

        return addressDTO;
    }
}