朵小喵儿|七种对象复制工具类,你最看好哪个?( 七 )


上面定义完成之后 , 我们就可以直接使用 StudentMapper 一行代码搞定对象转换 。
// 忽略其他代码StudentDO studentDO = StudentMapper.INSTANCE.dtoToDo(studentDTO);如果我们对象使用 Lombok 的话 , 使用 @Mapping指定不同字段名 , 编译期间可能会抛出如下的错误:
朵小喵儿|七种对象复制工具类,你最看好哪个?这个原因主要是因为 Lombok 也需要编译期间自动生成代码 , 这就可能导致两者冲突 , 当 MapStruct 生成代码时 , 还不存在 Lombok 生成的代码 。
解决办法可以在 maven-compiler-plugin插件配置中加入 Lombok , 如下:
org.apache.maven.pluginsmaven-compiler-plugin3.8.11.8 1.8 org.mapstructmapstruct-processor1.3.1.Finalorg.projectlomboklombok1.18.12输出 DO 与 DTO 如下:
朵小喵儿|七种对象复制工具类,你最看好哪个?从上图中我们可以得到一些结论:

  • 部分类型不一致 , 可以自动转换 , 比如
    • 基本类型与包装类型
    • 基本类型的包装类型与 String
  • 深拷贝
上面介绍的例子介绍一些简单字段映射 , 如果小伙伴在工作总共还碰到其他的场景 , 可以先查看一下这个工程 , 查看一下有没有结局解决办法:
上面我们已经知道 MapStruct 在编译期间就生成了代码 , 下面我们来看下自动生成代码:
public class StudentMapperImpl implements StudentMapper {public StudentMapperImpl() {}public StudentDO dtoToDo(StudentDTO studentDTO) {if (studentDTO == null) {return null;} else {StudentDO studentDO = new StudentDO();studentDO.setNumber(studentDTO.getNo());try {if (studentDTO.getCreateDate() != null) {studentDO.setCreateDate((new SimpleDateFormat("yyyy-MM-dd")).parse(studentDTO.getCreateDate()));}} catch (ParseException var4) {throw new RuntimeException(var4);}studentDO.setName(studentDTO.getName());if (studentDTO.getAge() != null) {studentDO.setAge(String.valueOf(studentDTO.getAge()));}List list = studentDTO.getSubjects();if (list != null) {studentDO.setSubjects(new ArrayList(list));}studentDO.setCourse(studentDTO.getCourse());return studentDO;}}}从生成的代码来看 , 里面并没有什么黑魔法 , MapStruct 自动生成了一个实现类 StudentMapperImpl , 里面实现了 dtoToDo , 方法里面调用 getter/setter设值 。
从这个可以看出 , MapStruct 作用就相当于帮我们手写getter/setter设值 , 所以它的性能会很好 。
总结看完这篇文章 , 我们一共学习了 7 个属性复制工具类 , 这么多工具类我们该如何选择呢?阿粉讲讲自己的一些见解:
第一 , 首先我们直接抛弃 Apache Beanutils, 这个不用说了 , 阿里巴巴规范都这样定了 , 我们就不要使用好了 。
第二 , 当然是看工具类的性能 , 这些工具类的性能 , 网上文章介绍的比较多 , 阿粉就复制过来 , 大家可以比较一下 。
朵小喵儿|七种对象复制工具类,你最看好哪个?来自:


推荐阅读