朵小喵儿|七种对象复制工具类,你最看好哪个?( 六 )
这里我们要注意 , 在我们使用 classMap 之后 , 如果想要相同字段名属性默认被复制 , 那么一定调用 byDefault方法 。
简单对比一下 DTO 与 DO 对象:
上图可以发现 orika 的一些特性:
- 默认支持类型不一致(基本类型/包装类型)转换
- 支持深拷贝
- 指定不同字段名映射关系 , 属性可以被成功复制 。
MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();Listpersons = new ArrayList<>();ListpersonDtos = mapperFactory.getMapperFacade().mapAsList(persons, PersonDto.class);最后聊下 orika 实现原理 , orika 与 dozer 底层原理不太一样 , 底层其使用了 javassist 生成字段属性的映射的字节码 , 然后直接动态加载执行字节码文件 , 相比于 Dozer 的这种使用反射原来的工具类 , 速度上会快很多 。上面介绍的这些工具类 , 不管使用反射 , 还是使用字节码技术 , 这些都需要在代码运行期间动态执行 , 所以相对于手写硬编码这种方式 , 上面这些工具类执行速度都会慢很多 。
那有没有一个工具类的运行速度与硬编码这种方式差不多呢?
这就要介绍 MapStruct 这个工具类 , 这个工具类之所以运行速度与硬编码差不多 , 这是因为它在编译期间就生成了 Java Bean 属性复制的代码 , 运行期间就无需使用反射或者字节码技术 , 所以确保了高性能 。
另外 , 由于编译期间就生成了代码 , 所以如果有任何问题 , 编译期间就可以提前暴露 , 这对于开发人员来讲就可以提前解决问题 , 而不用等到代码应用上线了 , 运行之后才发现错误 。
下面我们来看下 , 怎么使用这个工具类 , 首先我们先引入这个依赖:
org.mapstruct mapstruct1.3.1.Final 其次 , 由于 MapStruct 需要在编译器期间生成代码 , 所以我们需要 maven-compiler-plugin插件中配置:org.apache.maven.plugins maven-compiler-plugin3.8.1 1.8 1.8 org.mapstruct mapstruct-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 字段类型不一致 , 这里我们还需要指定时间格式化类型 。
推荐阅读
- 朵小喵儿|2021年迎来考验,美国企业或将再次入局,国产手机
- 朵小喵儿|国产手机,2021年迎来考验,美国企业或将再次入局
- 朵小喵儿|突破旗舰封锁,魅族今年性能旗舰亮新玩法,销量真稳了
- 朵小喵儿|小天才手表背后,是成人世界的焦虑
- 朵小喵儿|主板维修必备!海量主板电路图+CPU程序下载
- 朵小喵儿|如何成为制造大国?曹德旺一语中的:先把“这个”取消再说
- 朵小喵儿|蔚来总部临时办公大楼预计下月启用 位于合肥经开区
- 朵小喵儿|腾讯AI Lab高级研究员宋林峰:图到文本生成任务中的通用型图结构信息保存法
- 朵小喵儿|突发!特朗普政府考虑将国内最大芯片制造商中芯国际列入贸易黑名单
- 朵小喵儿|硬件捡垃圾33期
