后端开发优化mapstruct的使用
乐常用的属性映射方法
一般来说,不使用MapStruct框架进行属性映射,常有的方法以下两种:
1.Getter/Setter方法手动映射
这种方法最朴素,手动编写代码将源对象的属性存入目标对象,需要注意实体类中嵌套属性的判空操作以防止空指针异常。
2.BeanUtils.copyProperties()方法进行映射
BeanUtils底层使用的是反射机制实现属性的映射。反射是一种在运行时动态获取类信息、调用方法或访问字段的机制,无法利用JVM的优化机制,因此通常比直接方法调用慢得多。
此外,BeanUtils 只能同属性映射,或者在属性相同的情况下,允许被映射的对象属性少;但当遇到被映射的属性数据类型被修改或者被映射的字段名被修改,则会导致映射失败
如何使用
1. 定义实体类以及被映射类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| @Data @NoArgsConstructor @AllArgsConstructor @Builder public class User { private Integer id; private String name; private String createTime; private LocalDateTime updateTime; }
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class UserVO1 { private Integer id; private String name; private String createTime; private LocalDateTime updateTime; }
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class UserVO2 { private Integer id; private String name; private String createTime; }
|
2. 定义接口
当实体类和被映射对象属性相同或者被映射对象属性值少几个时:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Mapper(componentModel = "spring") public interface UserCovertBasic { UserCovertBasic INSTANCE = Mappers.getMapper(UserCovertBasic.class);
UserVO1 toConvertVO1(User source); User fromConvertEntity1(UserVO1 userVO1);
UserVO2 toConvertVO2(User source); }
|
3. 查看编译结果
通过IDE的反编译功能查看编译后自动生成 UserCovertBasic 的实现类 UserCovertBasicImpl ,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| @Component public class UserCovertBasicImpl implements UserCovertBasic { public UserCovertBasicImpl() { } public UserVO1 toConvertVO1(User source) { if (source == null) { return null; } else { UserVO1 userVO1 = new UserVO1(); userVO1.setId(source.getId()); userVO1.setName(source.getName()); userVO1.setCreateTime(source.getCreateTime()); userVO1.setUpdateTime(source.getUpdateTime()); return userVO1; } } public User fromConvertEntity1(UserVO1 userVO1) { if (userVO1 == null) { return null; } else { User user = new User(); user.setId(userVO1.getId()); user.setName(userVO1.getName()); user.setCreateTime(userVO1.getCreateTime()); user.setUpdateTime(userVO1.getUpdateTime()); return user; } } public UserVO2 toConvertVO2(User source) { if (source == null) { return null; } else { UserVO2 userVO2 = new UserVO2(); userVO2.setId(source.getId()); userVO2.setName(source.getName()); userVO2.setCreateTime(source.getCreateTime()); return userVO2; } }
|