JavaBean类型映射简化 MapStruct
它是什么?
MapStruct 是一个代码生成器,它基于约定优于配置方法极大地简化了 Java bean 类型之间映射的实现。
生成的映射代码使用简单的方法调用,因此速度快、类型安全且易于理解。
为什么使用?
多层应用程序通常需要在不同的对象模型(例如实体和 DTO)之间进行映射。编写这样的映射代码是一项乏味且容易出错的任务。MapStruct 旨在通过尽可能自动化来简化这项工作。
与其他映射框架相比,MapStruct 在编译时生成 bean 映射,以确保高性能,允许快速的开发人员反馈和彻底的错误检查。
如何使用?
MapStruct 是一个注解处理器,它插入到 Java 编译器中,可用于命令行构建(Maven、Gradle 等)以及您首选的 IDE。
MapStruct 使用合理的默认值,但在配置或实现特殊行为时会避开您的方式。
一、添加POM文件
<properties> <mapstruct.version>1.4.1.Final</mapstruct.version> </properties> ... ... ... <dependencies> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>${mapstruct.version}</version> </dependency>
</dependencies>
另外 本次还使用了lombok 、junit:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
maven构建配置:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.1.RELEASE</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>8</source> <target>8</target> <encoding>UTF-8</encoding> <annotationProcessorPaths> <!-- 必须要加, 否则生成不了 MapperImpl 实现类 --> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </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; } }