DTO,VO,PO的意义与他们之间的转换

DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。再通俗一点来说就是前端传给后端的JSON数据其为数据库对应实体的部分字段(这样做的目的也很好理解,比如你在修改的接口使用的是完整实体,那么你可能在前端只传了你想要的改的,但是不排除其它情况的篡改,比如添加了别的不能修改的字段可能就会产生问题)

VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。通俗一点就是说你在后端接口处理完返回给前端的实但是VO这要前端想要的字段

PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。这就是VO里说的数据库完整的映射对象实体

这三个是常用的,可以通过代码生成器来直接生成

转换器:

转换器是用来将PO,VO,DTO 进行转换的工具,直接上代码:

java 复制代码
   <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${org.mapstruct.version}</version>
        </dependency>

这是MapStruct官网提供的一个工具很好用

若源对象属性与目标对象属性名字一致,会自动映射对应属性,不一样的需要指定,也可以用 format 转成自己想要的类型,也支持表达式的方式,可以看到像 id、name、email这些名词一致的我并没有指定 source-target,而birthday-birth指定了,转换格式的 birthDateFormat 加了dateFormat 或者 birthExpressionFormat 加了 expression,如果某个属性你不想映射,可以加个 ignore=true

java 复制代码
@Mapper
public interface PersonConverter {
    PersonConverter INSTANCE = Mappers.getMapper(PersonConverter.class);
    @Mappings({
        @Mapping(source = "birthday", target = "birth"),
        @Mapping(source = "birthday", target = "birthDateFormat", dateFormat = "yyyy-MM-dd HH:mm:ss"),
        @Mapping(target = "birthExpressionFormat", expression = "java(org.apache.commons.lang3.time.DateFormatUtils.format(person.getBirthday(),\"yyyy-MM-dd HH:mm:ss\"))"),
        @Mapping(source = "user.age", target = "age"),
        @Mapping(target = "email", ignore = true)
    })
    PersonDTO domain2dto(Person person);
    Person gerPerson(PersonDTO personDTO);
    List<PersonDTO> domain2dto(List<Person> people);
}

然后就会在target里自动生成他的实现类

项目中直接注入转换器,使用里面自己定义的方法就可以

java 复制代码
 Person person= PersonConverter.INSTANCE.getPerson(personDTO);

MapStruct 注解的关键词

@Mapper 只有在接口加上这个注解, MapStruct 才会去实现该接口

@Mapper 里有个 componentModel 属性,主要是指定实现类的类型,一般用到两个

default:默认,可以通过 Mappers.getMapper(Class) 方式获取实例对象

spring:在接口的实现类上自动添加注解 @Component,可通过 @Autowired 方式注入

@Mapping:属性映射,若源对象属性与目标对象名字一致,会自动映射对应属性

source:源属性

target:目标属性

dateFormat:String 到 Date 日期之间相互转换,通过 SimpleDateFormat,该值为 SimpleDateFormat 的日期格式

ignore: 忽略这个字段

@Mappings:配置多个@Mapping

@MappingTarget 用于更新已有对象

@InheritConfiguration 用于继承配置

要查看完整功能可参考官网:

java 复制代码
http://mapstruct.org/documentation/stable/reference/html/
相关推荐
wrx繁星点点14 小时前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
JungleCoding14 小时前
403 Request Entity Too Lager(请求体太大啦)
状态模式
XYX的Blog1 天前
设计模式09-行为型模式2(状态模式/策略模式/Java)
设计模式·状态模式·策略模式
kevin_tech1 天前
Go API 多种响应的规范化处理和简化策略
开发语言·后端·golang·状态模式
denghai邓海2 天前
基于势能的平面运动模拟
python·平面·状态模式
JAVA开发区3 天前
设计模式之状态模式
设计模式·状态模式·状态转换
cgv35 天前
springboot2.x使用SSE方式代理或者转发其他流式接口
状态模式·springboot sse·sse流式接口·see代理流式接口·sse转发流式接口
mushangqiujin5 天前
ctfshow web入门文件上传总结
网络安全·状态模式
Yvemil76 天前
“高效开发之路:用Spring MVC构建健壮的企业级应用”
状态模式
wrx繁星点点7 天前
状态模式:封装对象状态并改变行为的设计模式
java·开发语言·spring·ui·设计模式·状态模式