3.1、类型不一致
实体类我们还是沿用 User
;被映射对象 UserVO3
改为:
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class UserVO3 { private String id; private String name; // 实体类该属性是String private LocalDateTime createTime; // 实体类该属性是LocalDateTime private String updateTime; }
那么我们定义的接口就要稍稍修改一下了:
@Mappings({ @Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"), }) UserVO3 toConvertVO3(User source); User fromConvertEntity3(UserVO3 userVO3);
上面 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); } }
通过IDE的反编译功能查看编译后的实现类,结果是这样子的:
从图中我们可以看到,编译时使用了expression中定义的表达式对目标字段 createTime
进行了转换;然后你还会发现 updateTime
字段也被自动从 LocalDateTime 类型转换成了 String 类型。
阿粉小结:
当字段类型不一致时,以下的类型之间是 mapstruct
自动进行类型转换的:
- 1、基本类型及其他们对应的包装类型。此时
mapstruct
会自动进行拆装箱。不需要人为的处理 - 2、基本类型的包装类型和string类型之间
除此之外的类型转换我们可以通过定义表达式来进行指定转换。
3.2、字段名不一致
实体类我们还是沿用 User
;被映射对象 UserVO4
改为:
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class UserVO4 { // 实体类该属性名是id private String userId; // 实体类该属性名是name private String userName; private String createTime; private String updateTime; }
那么我们定义的接口就要稍稍修改一下了:
@Mappings({ @Mapping(source = "id", target = "userId"), @Mapping(source = "name", target = "userName") }) UserVO4 toConvertVO(User source); User fromConvertEntity(UserVO4 userVO4);
通过IDE的反编译功能查看编译后的实现类,编译后的结果是这样子的:
阿粉小结:
当字段名不一致时,通过使用 @Mappings
注解指定对应关系,编译后即可实现对应字段的赋值。
很明显, mapstruct
通过读取我们配置的字段名对应关系,帮我们把它们赋值在了相对应的位置上,可以说是相当优秀了,但这也仅仅是优秀,而更秀的还请继续往下看: