java开发中DTO、VO、PO之间的转换你应该这么操作

Wesley13
• 阅读 611

java开发中DTO、VO、PO之间的转换你应该这么操作

java开发中DTO、VO、PO之间的转换你应该这么操作

痛点

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

假如Car 类是数据库映射类

java开发中DTO、VO、PO之间的转换你应该这么操作

java开发中DTO、VO、PO之间的转换你应该这么操作

CarDTO是DTO 类

java开发中DTO、VO、PO之间的转换你应该这么操作

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

java开发中DTO、VO、PO之间的转换你应该这么操作

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

java开发中DTO、VO、PO之间的转换你应该这么操作

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

安装

引入maven 依赖坐标

java开发中DTO、VO、PO之间的转换你应该这么操作

编写映射

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

java开发中DTO、VO、PO之间的转换你应该这么操作

声明一个映射接口用@org.mapstruct.Mapper 标记,说明这是一个bean转换接口。这里我们声明了一个 CAR_MAPPING 来方便我们调用,CarDTO toCarDTO(Car car)是不是很熟悉, 像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<String> stringListToDateList(List<Date> dates);

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

java开发中DTO、VO、PO之间的转换你应该这么操作

总结

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

下方查看 历史文章

java开发中DTO、VO、PO之间的转换你应该这么操作

让你的代码更加简练,springboot使用JSR303校验

10分钟就能轻松入门消息中间件rabbitmq(附带教学源码)

精选github开源的重量级精品java教程,学会这个你敢说你精通java

java开发中DTO、VO、PO之间的转换你应该这么操作

本文分享自微信公众号 - 码农小胖哥(Felordcn)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
技术小男生 技术小男生
5个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
5个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
小森森 小森森
5个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
Wesley13 Wesley13
1年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Wesley13 Wesley13
1年前
030 SSM综合练习06
1.权限操作涉及的三张表(1)用户表信息描述users!(https://oscimg.oschina.net/oscnet/a4a2b1f943cbc2db1c8ddd613e7ed00a9ae.png)sql语句:CREATETABLEusers(idVARCHAR2(32)DEFAU
Stella981 Stella981
1年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
NVIDIA安培架构下MIG技术分析
关键词:NVIDIA、MIG、安培一什么是MIG2020年5月,NVIDIA发布了最新的GPU架构:安培,以及基于安培架构的最新的GPU:A100。安培提供了许多新的特性,MIG是其中一项非常重要的新特性。MIG的全名是MultiInstanceGPU。NVIDIA安培架构中的MIG模式可以在A100GPU上并行运行七个作业。多实