依赖包
<dependency>
<groupId>org.mapstruct</groupId>
<!-- jdk8以下就使用mapstruct -->
<artifactId>mapstruct-jdk8</artifactId>
<version>1.2.0.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.2.0.Final</version>
</dependency>
使用
数据准备
// 实体类
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class User {
private Integer id;
private String name;
private String createTime;
private LocalDateTime updateTime;
}
// 被映射类VO1:和实体类一模一样
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO1 {
private Integer id;
private String name;
private String createTime;
private LocalDateTime updateTime;
}
// 被映射类VO1:比实体类少一个字段
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO2 {
private Integer id;
private String name;
private String createTime;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO3 {
private String id;
private String name;
// 实体类该属性是String
private LocalDateTime createTime;
// 实体类该属性是LocalDateTime
private String updateTime;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVO4 {
// 实体类该属性名是id
private String userId;
// 实体类该属性名是name
private String userName;
private String createTime;
private String updateTime;
}
普通转换
@Mapper(componentModel = "spring")
public interface UserCovertBasic {
UserCovertBasic INSTANCE = Mappers.getMapper(UserCovertBasic.class);
/**
* 字段数量类型数量相同,利用工具BeanUtils也可以实现类似效果
* @param source
* @return
*/
UserVO1 toConvertVO1(User source);
User fromConvertEntity1(UserVO1 userVO1);
/**
* 字段数量类型相同,数量少:仅能让多的转换成少的,故没有fromConvertEntity2
* @param source
* @return
*/
UserVO2 toConvertVO2(User source);
}
转换一个集合
List<UserVO1> toConvertVOList(List<User> source);
复杂转换
// 方式一:调用自定义方法(见下方)
@Mappings({
@Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"),
})
UserVO3 toConvertVO3(User source);
User fromConvertEntity3(UserVO3 userVO3);
// 方式二:调用提供的dateFormat 方法
@Mappings({
@Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss"),
})
UserVO3 toConvertVO3_1(User source);
// 字段名不一致
@Mappings({
@Mapping(source = "id", target = "userId"),
@Mapping(source = "name", target = "userName")
})
UserVO4 toConvertVO(User source);
User fromConvertEntity4(UserVO4 userVO4);
上面 expression 指定的表达式内容如下:
public class DateTransform {
public static LocalDateTime strToDate(String str){
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm:ss");
return LocalDateTime.parse("2018-01-12 17:07:05",df);
}
}
小结
1、基本类型及其他们对应的包装类型。
此时 mapstruct 会自动进行拆装箱。不需要人为的处理
2、基本类型的包装类型和string类型之间
当字段名不一致时,通过使用 @Mappings 注解指定对应关系,编译后即可实现对应字段的赋值。
属性是枚举类型:默认取的是基础的枚举的name属性
// 编译后:
public UserVO5 convertEnum(UserEnum userEnum) {
if (userEnum == null) {
return null;
} else {
UserVO5.UserVO5Builder userVO5 = UserVO5.builder();
if (userEnum.getUserTypeEnum() != null) {
userVO5.type(userEnum.getUserTypeEnum().name());
}
userVO5.id(userEnum.getId());
userVO5.name(userEnum.getName());
return userVO5.build();
}
}
// 取的是"Java","DB","LINUX"
@Getter
@AllArgsConstructor
public enum UserTypeEnum {
Java("000", "Java?????"),
DB("001", "??????"),
LINUX("002", "Linux???");
private String value;
private String title;
}