依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<!-- 版本一定要在3.6.0以上,若版本低,则会报找不到属性的错误 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<!--一定要在 maven-compiler-plugin 插件中,声明 mapstruct-processor 为 JSR 269 的 Java 注解处理器-->
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
使用
package com.example.util;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateTransform {
public static LocalDateTime strToDate(String str) {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
return LocalDateTime.parse(str, df);
}
}
@Mapper(componentModel = "spring")
public interface UserConvert {
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
/**
* 字段相同属性名称相同时,采用 BeanUtil 也可以实现相同功能
*/
User01 convert(User user);
List<User01> convert(List<User> users);
/**
* 字段数量类型相同,数量少:仅能让多的转换成少的
*/
User02 convertV02(User user);
User convertV(User02 user02);
@Mapping(target = "updateTime", expression = "java(com.example.util.DateTransform.strToDate(user03.getUpdateTime()))")
User convertFromUser03(User03 user03);
}
public class User {
private Integer id;
private String name, createTime;
private LocalDateTime updateTime;
}
public class User01 {
private Integer id;
private String name, createTime;
private LocalDateTime updateTime;
}
public class User02 {
private Integer id;
private String name, createTime;
}
public class User03 {
private String id, name;
// 实体类该属性是String
private LocalDateTime createTime;
// 实体类该属性是LocalDateTime
private String updateTime;
}
多转一
在多对一转换时, 遵循以下几个原则
- 当多个对象中, 有其中一个为 null, 则会直接返回 null
- 如一对一转换一样, 属性通过名字来自动匹配。 因此, 名称和类型相同的不需要进行特殊处理
- 当多个原对象中,有相同名字的属性时,需要通过
@Mapping
注解来具体的指定, 以免出现歧义(不指定会报错)。 如上面的description
public class Address {
private String street, zipCode, houseNo, description;
}
public class Person {
private int height;
private String firstName, lastName, description;
}
public class DeliveryAddress {
private int height;
private String street, zipCode, houseNumber, description;
private String firstName, lastName;
}
@Mapping(source = "person.description", target = "description")
@Mapping(source = "address.houseNo", target = "houseNumber")
DeliveryAddress personAndAddress(Person person, Address address);
更新Bean对象
有时候, 并不是想返回一个新的 Bean 对象, 而是希望更新传入对象的一些属性。这个在实际的时候也会经常使用到
void update(User user, @MappingTarget User01 user01);
public void update(User user, User01 user01) {
if (user != null) {
user01.setId(user.getId());
user01.setName(user.getName());
user01.setCreateTime(user.getCreateTime());
user01.setUpdateTime(user.getUpdateTime());
}
}