当前位置:

首页 > 编程开发 > java中VO和DTO之间的转换怎么实现

java中VO和DTO之间的转换怎么实现

一、背景1.领域模型中的实体类分为四种类型:VO、DTO、DO、PO二、详细讲解1.VO(ViewObject),视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。2.DTO(DataTransferObject),数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。3.DO(DomainObject),领域对象

本文目录

      一、背景

      1.领域模型中的实体类分为四种类型:VO、DTO、DO、PO

      二、详细讲解

      1.VO(View Object),视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

      2.DTO(Data Transfer Object),数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。

      3.DO(Domain Object),领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

      4.PO(PersistentObject),持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

      5.举例:

      后端返回个前端的对象,可以 ***VO.java

      mybatis生成的dao表实体对象,可以 ****PO.java

      一般是 PO 转换 DO 然后 转换 DTO提供服务供外部调用

      注意

      PO一般自动生成和表字段一一映射

      DO一般和DO很多字段是一样带,但很多如类型字段是枚举,有的项目中DO是Model结尾的类

      DTO如webservice接口(提供外部服务的),返回结果对象都是DTO,里面属性的定义比较讲究,易懂安全好扩展,DTO与DTO之间关系是包含还是平级,设计的时候一定要定义清楚,不然后期就是个坑

      VO比较简单,前端展示需要什么就怎么定义

      三、实体对象间的转换

      一个规范的项目

      代码中充满了VO、From、DTO、DO等等pojo类,这些类作用不一样但类里面的属性值往往一模一样,当属性非常多时,一个个set的确非常累人又耗时间,其实强大的Spring早为我们准备好了贴心工具,一行搞定以前甚至30行的代码量

      四、第一种方法的具体代码例子

      1.导入依赖

      
        org.springframework
        spring-beans
        5.1.6.RELEASE
      

      2.一个DTO(接口定义对象一般用DTO)

      public class TestDemoDTO{
          private String name;
          private Map citys;
          private Date gmtStart;
          private Boolean flag;
          private Integer age;
          private List types;
       
          public String getName() {
              return name;
          }
       
          public void setName(String name) {
              this.name = name;
          }
       
          public Map getCitys() {
              return citys;
          }
       
          public void setCitys(Map citys) {
              this.citys = citys;
          }
       
          public Date getGmtStart() {
              return gmtStart;
          }
       
          public void setGmtStart(Date gmtStart) {
              this.gmtStart = gmtStart;
          }
       
          public Boolean getFlag() {
              return flag;
          }
       
          public void setFlag(Boolean flag) {
              this.flag = flag;
          }
       
          public Integer getAge() {
              return age;
          }
       
          public void setAge(Integer age) {
              this.age = age;
          }
       
          public List getTypes() {
              return types;
          }
       
          public void setTypes(List types) {
              this.types = types;
          }
       
          @Override
          public String toString() {
              return "TestDemoDTO{" +
                      "name='" + name + '\'' +
                      ", citys=" + citys +
                      ", gmtStart=" + gmtStart +
                      ", flag=" + flag +
                      ", age=" + age +
                      ", types=" + types +
                      '}';
          }
      }

      3.一个From(前端入参定义From)

      public class TestDemoFrom {
          private String name;
          private Map citys;
          private Date gmtStart;
          private Boolean flag;
          private Integer age;
          private List types;
       
          public String getName() {
              return name;
          }
       
          public void setName(String name) {
              this.name = name;
          }
       
          public Map getCitys() {
              return citys;
          }
       
          public void setCitys(Map citys) {
              this.citys = citys;
          }
       
          public Date getGmtStart() {
              return gmtStart;
          }
       
          public void setGmtStart(Date gmtStart) {
              this.gmtStart = gmtStart;
          }
       
          public Boolean getFlag() {
              return flag;
          }
       
          public void setFlag(Boolean flag) {
              this.flag = flag;
          }
       
          public Integer getAge() {
              return age;
          }
       
          public void setAge(Integer age) {
              this.age = age;
          }
       
          public List getTypes() {
              return types;
          }
       
          public void setTypes(List types) {
              this.types = types;
          }
       
          @Override
          public String toString() {
              return "TestDemoFrom{" +
                      "name='" + name + '\'' +
                      ", citys=" + citys +
                      ", gmtStart=" + gmtStart +
                      ", flag=" + flag +
                      ", age=" + age +
                      ", types=" + types +
                      '}';
          }
      }

      4.测试类

      public class TestDemo {
          public static void main(String[] args) {
              TestDemoFrom testDemoFrom = new TestDemoFrom();
              HashMap map = Maps.newHashMap();
              map.put("001","北京");
              map.put("002","上海");
              map.put("003","广州");
              testDemoFrom.setCitys(map);
              testDemoFrom.setFlag(true);
              testDemoFrom.setGmtStart(new Date());
              testDemoFrom.setName("诺言");
              testDemoFrom.setAge(18);
              testDemoFrom.setTypes(Lists.newArrayList("我爱","宝贝"));
              System.out.printf(testDemoFrom.toString()+"\n");
              //下面就可以开始转化了,就一行代码
              TestDemoDTO testDemoDTO = new TestDemoDTO();
              BeanUtils.copyProperties(testDemoFrom,testDemoDTO);
       
              System.out.println(testDemoDTO.toString());
          }
      }

      5.结果

      TestDemoFrom{name='诺言', citys={001=北京, 002=上海, 003=广州}, gmtStart=Fri May 10 22:37:53 CST 2019, flag=true, age=18, types=[我爱, 宝贝]}
      TestDemoDTO{name='诺言', citys={001=北京, 002=上海, 003=广州}, gmtStart=Fri May 10 22:37:53 CST 2019, flag=true, age=18, types=[我爱, 宝贝]}

      6.注意

      注意赋值失败情况
      如果属性名称不同就会赋值不了
      如果类型不同,名称相同也是会赋值不了

      五、第二种方法的具体代码例子(使用dozer)

      1.导入依赖

      
        net.sf.dozer
        dozer
        5.4.0
      

      2.测试类

      public class TestDemoDozer {
          @Test
          public void test() {
              DozerBeanMapper mapper = new DozerBeanMapper();
              TestDemoFrom testDemoFrom = new TestDemoFrom();
              HashMap map = Maps.newHashMap();
              map.put("001","北京");
              map.put("002","上海");
              map.put("003","广州");
              testDemoFrom.setCitys(map);
              testDemoFrom.setFlag(true);
              testDemoFrom.setGmtStart(new Date());
              testDemoFrom.setName("诺言");
              testDemoFrom.setAge(18);
              testDemoFrom.setTypes(Lists.newArrayList("我爱","宝贝"));
              System.out.printf(testDemoFrom.toString()+"\n");
              // 转换
              TestDemoDTO convert = mapper.map(testDemoFrom,TestDemoDTO.class);
              System.out.println(convert);
          }
          
      }

      3.结果

       TestDemoFrom{name='诺言', citys={001=北京, 002=上海, 003=广州}, gmtStart=Sat May 11 00:30:02 CST 2019, flag=true, age=18, types=[我爱, 宝贝]}
      TestDemoDTO{name='诺言', citys={001=北京, 002=上海, 003=广州}, gmtStart=Sat May 11 00:30:02 CST 2019, flag=true, age=18, types=[我爱, 宝贝]}

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Yandex官网入口及网页搜索使用方法
      Yandex官网入口及网页搜索使用方法

      Yandex官网入口是https://www.yondex.net/,该平台支持多语言切换、智能搜索匹配、虚拟键盘变更及实时翻译,提供地图、图片、新闻、购物等垂直服务,并具备账户同步、隐私管理、个性化首页和云存储等功能。

      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。