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


这里我们要注意 , 在我们使用 classMap 之后 , 如果想要相同字段名属性默认被复制 , 那么一定调用 byDefault方法 。
简单对比一下 DTO 与 DO 对象:
朵小喵儿|七种对象复制工具类,你最看好哪个?上图可以发现 orika 的一些特性:

  • 默认支持类型不一致(基本类型/包装类型)转换
  • 支持深拷贝
  • 指定不同字段名映射关系 , 属性可以被成功复制 。
另外 orika 还支持集合映射:
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();Listpersons = new ArrayList<>();ListpersonDtos = mapperFactory.getMapperFacade().mapAsList(persons, PersonDto.class);最后聊下 orika 实现原理 , orika 与 dozer 底层原理不太一样 , 底层其使用了 javassist 生成字段属性的映射的字节码 , 然后直接动态加载执行字节码文件 , 相比于 Dozer 的这种使用反射原来的工具类 , 速度上会快很多 。
朵小喵儿|七种对象复制工具类,你最看好哪个?MapStruct不知不觉 , 一口气已经写了 5 个属性复制工具类 , 小伙伴都看到这里 , 那就不要放弃了 , 坚持看完 , 下面将介绍一个与上面这些都不太一样的工具类「MapStruct」 。
上面介绍的这些工具类 , 不管使用反射 , 还是使用字节码技术 , 这些都需要在代码运行期间动态执行 , 所以相对于手写硬编码这种方式 , 上面这些工具类执行速度都会慢很多 。
那有没有一个工具类的运行速度与硬编码这种方式差不多呢?
这就要介绍 MapStruct 这个工具类 , 这个工具类之所以运行速度与硬编码差不多 , 这是因为它在编译期间就生成了 Java Bean 属性复制的代码 , 运行期间就无需使用反射或者字节码技术 , 所以确保了高性能 。
另外 , 由于编译期间就生成了代码 , 所以如果有任何问题 , 编译期间就可以提前暴露 , 这对于开发人员来讲就可以提前解决问题 , 而不用等到代码应用上线了 , 运行之后才发现错误 。
下面我们来看下 , 怎么使用这个工具类 , 首先我们先引入这个依赖:
org.mapstructmapstruct1.3.1.Final其次 , 由于 MapStruct 需要在编译器期间生成代码 , 所以我们需要 maven-compiler-plugin插件中配置:
org.apache.maven.pluginsmaven-compiler-plugin3.8.11.8 1.8 org.mapstructmapstruct-processor1.3.1.Final接下来我们需要定义映射接口 , 代码如下:
@Mapperpublic interface StudentMapper {StudentMapper INSTANCE = Mappers.getMapper(StudentMapper.class);@Mapping(source = "no", target = "number")@Mapping(source = "createDate", target = "createDate", dateFormat = "yyyy-MM-dd")StudentDO dtoToDo(StudentDTO studentDTO);}我们需要使用 MapStruct 注解 @Mapper 定义一个转换接口 , 这样定义之后 , StudentMapper 的功能就与 BeanUtils 等工具类一样了 。
其次 , 由于我们 DTO 与 DO 对象中存在字段名不一致的情况 , 所以我们还在在转换方法上使用 @Mapping 注解指定字段映射 。 另外我们 createDate 字段类型不一致 , 这里我们还需要指定时间格式化类型 。


推荐阅读