对象转换工具MapStruct
- BeanUtils
- MapStruct
看到另一款对象转换工具,跟经常用的beanUtils不同,工作方式有点类似lombok注解
BeanUtils
这个是目前项目中用到的对象转换工具,有点很明显:使用方便,因为是静态方法,直接source、target传入即可,在Hutool和spring中都有提供。缺点也很明显,首先是属性名称不同会报错;其实是在运行时使用反射动态转换,字段太多可能影响性能。
MapStruct
对于上述的问题,MapStruct提供注解允许手动映射字段;由于是在编译期通过生成代码的方式进行转换,所以和普通代码一样执行。
// 定义entity
@Data
public class User {
private String id;
private String name;
private Date birth;
private int gender;
}
// 定义RO
@Data
@Builder
public class UserRO {
private String id;
private String username;
private String birthday;
private int sex;
}
// 定义转换关系
@Mapper // org.mapstruct.Mapper
public interface ConvertDemo {
ConvertDemo DEMO_INSTANCE = Mappers.getMapper(ConvertDemo.class);
@Mapping(source = "username", target = "name")
@Mapping(source = "birthday", target = "birth", dateFormat = "yyyy-MM-dd")
@Mapping(source = "sex", target = "gender")
User Ro2Entity(UserRO ro);
}
// 测试
@Test
void contextLoads() {
UserRO userRO = UserRO.builder()
.username("admin")
.sex(0)
.birthday("2024-0-24")
.build();
System.out.println(ConvertDemo.DEMO_INSTANCE.Ro2Entity(userRO));
}
可以看到target目录为ConvertDemo接口自动创建了实现类ConvertDemoImpl
public class ConvertDemoImpl implements ConvertDemo {
public ConvertDemoImpl() {
}
public User Ro2Entity(UserRO ro) {
if (ro == null) {
return null;
} else {
User user = new User();
user.setName(ro.getUsername());
try {
if (ro.getBirthday() != null) {
user.setBirth((new SimpleDateFormat("yyyy-MM-dd")).parse(ro.getBirthday()));
}
} catch (ParseException var4) {
ParseException e = var4;
throw new RuntimeException(e);
}
user.setGender(ro.getSex());
user.setId(ro.getId());
return user;
}
}