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

痛点

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

假如Car 类是数据库映射类

CarDTO是DTO 类

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

甚至中间还牵涉了很多类型转换,嵌套之类的繁琐操作,而我们想要的只是建立它们之间的映射关系而已。有没有一种通用的映射工具来帮我们搞定这一切。当然有而且还不少。有人说apache的

BeanUtil.copyProperties 可以实现,但是性能差而且容易出异常,很多规范严禁使用这种途径。以下是对几种对象映射框架的对比,大多数情况下 MapStruct 性能最高。类似于lombok ,Mapstruct都是在

编译期进行实现,所以一般不存在运行时性能问题。

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

安装

引入maven 依赖坐标

编写映射

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

声明一个映射接口用@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 stringListToDateList(List dates);

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

总结

其实MapStruct 还有很多的功能。但是从可读性来说,我建议只使用以上几种容易理解的功能即可,过于复杂也不利于后期维护。如果你感兴趣可以去mapstruct.org进一步学习。配合lombok和我的jsr303

教程,让你更加专注于业务,而且代码更加清晰。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java,BO(Business Object)、VO(Value Object)、DTO(Data Transfer Object)和DO(Domain Object)是常见的数据对象类型,它们之间转换可以通过以下方式实现: 1. BO转换VO:BO通常包含业务逻辑和数据访问方法,而VO只包含数据字段。因此,BO转换VO需要将BO的业务逻辑和数据访问方法去除,只保留数据字段。 2. VO转换为BO:VO只包含数据字段,而BO除了数据字段还包含业务逻辑和数据访问方法。因此,VO转换为BO需要将VO的数据字段赋值给BO,并添加业务逻辑和数据访问方法。 3. DTO转换为BO/VODTO通常用于在不同层之间传递数据,它包含需要传递的数据字段。DTO转换为BO/VO需要将DTO的数据字段赋值给BO/VO。 4. BO/VO转换DTO:BO/VO包含业务逻辑和数据访问方法,而DTO只包含需要传递的数据字段。因此,BO/VO转换DTO需要将BO/VO的数据字段赋值给DTO。 5. DO转换为BO/VO/DTO:DO通常用于与数据库交互,它包含数据库表的字段。DO转换为BO/VO/DTO需要将DO的字段赋值给BO/VO/DTO。 6. BO/VO/DTO转换为DO:BO/VO/DTO包含业务逻辑和数据访问方法,而DO只包含数据库表的字段。因此,BO/VO/DTO转换为DO需要将BO/VO/DTO的字段赋值给DO。 以上是常见的数据对象类型之间转换方式,根据具体的业务需求和数据结构,可能还需要进行其他类型的转换。 ### 回答2: 在Java,为了保证业务逻辑和数据持久化之间的解耦,常常要对数据进行转换,这时就用到了BO、VODTO和DO。以下是它们的详细解释和转换方式: 1. BO(Business Object)——业务对象 BO是指业务对象,它主要存储业务领域的实体类和业务逻辑。我们可以将BO理解为一个间层,在业务逻辑层使用。BO常常包含了多个DO对象(数据对象),他们之间通过相应的转换工具进行转换。 BO转换步骤: a.根据业务需求确定BO对象的属性; b.先将DO(数据对象)利用其构造方法初始化BO对象; c.在BO实现业务逻辑,对属性进行封装; d.利用VO工具类或其他工具类进行BO到VO转换。 2. VO(Value Object)——值对象 VO是指值对象,它用来封装数据传输过程的值对象。VO的属性和BO的属性可一一对应,VO一般用于数据展示和页面传输等操作,只包括BO特定业务属性的集合。 VO转换步骤: a.先根据实际需求,确定VO所需要封装的BO属性; b.利用VO构造方法,将BO属性值进行封装; c.最后利用 DTO(数据传输对象)将 VO 转换为 DO 对象。 3. DTO (Data Transfer Object)——数据传输对象 DTO是指数据传输对象,它用于在远程调用和分布式架构传输数据。DTO包含了多个数据对象(DO),将查询对象的数据进行封装,以减少对服务器的请求次数。 DTO转换步骤: a.首先,我们需要为DTO 创建对象; b.在DTO复制 DO(数据对象) 的属性,作为DTO的属性; c.利用工具类将 DO 对象转换DTO 对象,或将 DTO 对象转换成 DO 对象。 4. DO(Data Object)——数据对象 DO是指数据对象,它直接将数据库的表结构映射成业务对象。 DO转换步骤: a.将数据库表结构和业务表结构进行对应,定义好DO对象属性; b.利用DAO(数据访问对象)从数据库查询数据; c.利用工具类将 DO 对象转换成 BO 和 DTO 对象,以实现 BO 和 VO 对象的封装。(PS:不一定全部需要转换) 总结: BO、DTOVO和DO都是Java非常重要的概念,它们的作用都主要是为了解耦并减少数据层和业务层之间的耦合。业务逻辑通常位于BO,数据库的存储位置通常位于DO,而视图展示和页面交互通常位于VODTO是用于远程调用和分布式架构。在使用时,我们不仅要了解它们的作用,还要清楚它们之间转换方式,使得代码更加清晰、易于维护和扩展。 ### 回答3: 在Java开发,我们通常会用到BO(Business Object),VO(Value Object),DTO(Data Transfer Object)和DO(Domain Object)等概念。这些概念在业务逻辑会起到非常关键的作用。接下来,让我们分别来探讨一下这些概念。 BO,即业务对象,说白了就是应用程序的业务逻辑对象,是一个封装了业务逻辑的对象。它通常对应着业务模块的一个或多个业务流程,是Java应用程序最具有业务价值的一个对象。BO通常负责与前端页面交互,包含了业务逻辑处理的一些具体实现。 VO,即值对象,是一种用于表示简单数据结构的对象。它通常包含多个属性,但是没有业务方法。VO的目的是为了将一个或多个值打包,作为一个单独的实体来传递数据的方法。 DTO,即数据传输对象,是一种对象,并不具有业务逻辑。它的主要作用是在服务端和客户端之间数据传输。当一个远程调用发生时,需要从客户端传输数据到服务器端。由于传输的数据可能包含很多参数,使用DTO可以封装这些参数,并且可以封装多个参数,从而简化数据传输过程。 DO,即领域对象,是和数据库表相对应的一种对象。一般可以将数据库各个表的一行数据映射为DO对象,表达出数据从数据库取出后的实体对象。DO所扮演的角色类似ORM框架的实体类,通常需要与数据库进行交互以持久化数据。 在应用程序开发过程,为了将不同的概念进行区分,通常需要进行不同概念之间转换。例如,通过DTO对象将数据从后台传输至前台,或者通过VO对象将数据从页面传输至后台,都需要进行相应的转换。这些转换过程可以通过手动编写代码完成,也可以通过一些框架(例如Spring)提供的简化型转换注解来完成相关的转换过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值