JAVA项目中的po转换为vo_java开发中DTO、VO、PO之间的转换你应该这么操作

2a5d5de0eb9c0698c159238da37c0259.gif

e545410e0b9bea8289a81d901cb021a5.png

痛点

一种框架的出现都要解决个痛点,我想下面这这种不方便的操作经常有人写吧。

假如Car 类是数据库映射类

164913571b9bfe2b0f42582dfd09d501.png

9b286f8aa419c53b2410b33e1f30f3a7.png

CarDTO是DTO 类

50ea0fa61b3722e0d94d3d4591b93e55.png

通常我们会这么写一个方法进行转换

d5f1076275fb4a8c78aae655893edf4d.png

甚至中间还牵涉了很多类型转换,嵌套之类的繁琐操作,而我们想要的只是建立它们之间的映射关系而已。有没有一种通用的映射工具来帮我们搞定这一切。当然有而且还不少。有人说apache的BeanUtil.copyProperties 可以实现,但是性能差而且容易出异常,很多规范严禁使用这种途径。以下是对几种对象映射框架的对比,大多数情况下 MapStruct 性能最高。类似于lombok ,Mapstruct都是在编译期进行实现,所以一般不存在运行时性能问题。

ff4ed664139ab34b0240ee4f2db7611c.png

so,今天就搞一搞MapStruct,无论是idea 还是eclipse 都建议安装 mapstruct 插件。

安装

引入maven 依赖坐标

14a83d163790bbdbdc55ac9048581479.png

编写映射

我们把开始的痛点解决一下,编写Car到CarDTO的映射。

51cf62217ba716ee645031c17ea7f784.png

声明一个映射接口用@org.mapstruct.Mapper标记,说明这是一个bean转换接口。这里我们声明了一个CAR_MAPPING来方便我们调用,CarDTOtoCarDTO(Carcar)是不是很熟悉, 像mybatis一样抽象出我们的转换方法。org.mapstruct.Mapping注解用来声明成员属性的映射。这里以成员变量的参数名为依据,如果有嵌套比如Car里面有个CarType类型的成员变量type,其type属性 来映射CarDTO中的type字符串,我们使用type.type 来获取属性值。如果有多层以此类推。mapStruct 最终调用的是setter和getter 方法,而非反射。这也是其性能比较好的原因之一。numberOfSeats 映射到seatCount 就比较好理解了。我们是不是忘记了一个属性make,因为他们的位置且名称完全一致,所以可以省略。而且对于包装类是自动拆箱封箱操作的,并且是线程安全的。MapStruct不单单有这些功能,还有其他一些复杂的功能:

设置转换默认值和常量。当目标值是null 我们可以设置其默认值,注意这些都是基本类型以及对应都boxing类型,如下

@Mapping(target ="stringProperty", source ="stringProp", defaultValue ="undefined")

需要注意的是常量不能对源进行引用(不能指定source属性),下面是正确的操作

@Mapping(target ="stringConstant", constant ="Constant Value")

格式化也是我们经常使用的操作,比如数字格式化,日期格式化。

这是处理数字格式化的操作,遵循java.text.DecimalFormat的规范

@Mapping(source ="price", numberFormat ="$#.00")

下面展示了将一个日期集合映射到日期字符串集合的格式化操作上,遵循的

@IterableMapping(dateFormat ="dd.MM.yyyy")

List stringListToDateList(List dates);

我们还经常使用spring component 来处理  我们只需要这么声明,不用再构建一个单例,就可以像其他 spring bean一样对CarMapping 进行引用了。

89ce606722e079aa608bdd6577b04ea9.png

总结

其实MapStruct 还有很多的功能。但是从可读性来说,我建议使用以上几种容易理解的功能即可。如果你感兴趣可以去mapstruct.org进一步学习。配合lombok和我介绍的jsr303教程,让你更加专注于业务,而且代码更加清晰。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值