我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

今天小编给大家分享一下java中VO和DTO之间的转换怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    一、背景

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

    二、详细讲解

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

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

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

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

    举例:

    后端返回个前端的对象,可以 ***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行的代码量

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

    导入依赖

    <dependency>  <groupId>org.springframework</groupId>  <artifactId>spring-beans</artifactId>  <version>5.1.6.RELEASE</version></dependency>

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

    public class TestDemoDTO{    private String name;    private Map<String,String> citys;    private Date gmtStart;    private Boolean flag;    private Integer age;    private List<String> types;     public String getName() {        return name;    }     public void setName(String name) {        this.name = name;    }     public Map<String, String> getCitys() {        return citys;    }     public void setCitys(Map<String, String> 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<String> getTypes() {        return types;    }     public void setTypes(List<String> types) {        this.types = types;    }     @Override    public String toString() {        return "TestDemoDTO{" +                "name='" + name + '\'' +                ", citys=" + citys +                ", gmtStart=" + gmtStart +                ", flag=" + flag +                ", age=" + age +                ", types=" + types +                '}';    }}

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

    public class TestDemoFrom {    private String name;    private Map<String,String> citys;    private Date gmtStart;    private Boolean flag;    private Integer age;    private List<String> types;     public String getName() {        return name;    }     public void setName(String name) {        this.name = name;    }     public Map<String, String> getCitys() {        return citys;    }     public void setCitys(Map<String, String> 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<String> getTypes() {        return types;    }     public void setTypes(List<String> types) {        this.types = types;    }     @Override    public String toString() {        return "TestDemoFrom{" +                "name='" + name + '\'' +                ", citys=" + citys +                ", gmtStart=" + gmtStart +                ", flag=" + flag +                ", age=" + age +                ", types=" + types +                '}';    }}

    测试类

    public class TestDemo {    public static void main(String[] args) {        TestDemoFrom testDemoFrom = new TestDemoFrom();        HashMap<String, String> 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());    }}

    结果

    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=[我爱, 宝贝]}

    注意

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

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

    导入依赖

    <dependency>  <groupId>net.sf.dozer</groupId>  <artifactId>dozer</artifactId>  <version>5.4.0</version></dependency>

    测试类

    public class TestDemoDozer {    @Test    public void test() {        DozerBeanMapper mapper = new DozerBeanMapper();        TestDemoFrom testDemoFrom = new TestDemoFrom();        HashMap<String, String> 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);    }    }

    结果

     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=[我爱, 宝贝]}

    以上就是“java中VO和DTO之间的转换怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

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

    今天小编给大家分享一下java中VO和DTO之间的转换怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、背景1.领域
    2023-06-30

    NodeJS和C++之间怎么实现类型转换

    这篇文章主要介绍“NodeJS和C++之间怎么实现类型转换”,在日常操作中,相信很多人在NodeJS和C++之间怎么实现类型转换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”NodeJS和C++之间怎么实现类
    2023-06-17

    java实现Object和Map之间的转换3种方式

    利用commons.BeanUtils实现Obj和Map之间转换,这种是最简单,也是最经常用的public static Object mapToObject(Map map, Class<> beanCla
    2023-05-31

    js怎么实现base64、url和blob之间相互转换

    这篇文章主要讲解了“js怎么实现base64、url和blob之间相互转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“js怎么实现base64、url和blob之间相互转换”吧!一般来说前
    2023-07-06

    Java怎么实现Unicode和中文相互转换

    在Java中,可以使用java.nio.charset.StandardCharsets类和java.lang.String类来实现Unicode和中文的相互转换。要将中文字符串转换为Unicode编码,可以使用java.nio.chars
    2023-10-18

    如何实现Flex3中AS2和AS3之间事件转换

    这篇文章主要介绍如何实现Flex3中AS2和AS3之间事件转换,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!事件的转换AS3的事件与AS2有很大的不同,形势更统一,功能更强大。1.监听事件的方式(Handlingth
    2023-06-17

    PHP中日期时间和时间戳之间怎么转换

    这篇文章主要介绍“PHP中日期时间和时间戳之间怎么转换”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP中日期时间和时间戳之间怎么转换”文章能帮助大家解决问题。将日期时间转换为时间戳在 PHP 中
    2023-07-05

    基于Android中dp和px之间进行转换的实现代码

    在xml布局文件中,我们既可以设置px,也可以设置dp(或者dip)。一般情况下,我们都会选择使用dp,这样可以保证不同屏幕分辨率的机器上布局一致。但是在代码中,如何处理呢?很多控件的方法中都只提供了设置px的方法,例如setPadding
    2022-06-06

    QT怎么实现二、八、十六进制之间的转换

    这篇文章主要讲解了“QT怎么实现二、八、十六进制之间的转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“QT怎么实现二、八、十六进制之间的转换”吧!主要使用QT中的三个方法。第一个是QStr
    2023-06-30

    Java对象和Json文本怎么实现转换

    这篇文章主要介绍“Java对象和Json文本怎么实现转换”,在日常操作中,相信很多人在Java对象和Json文本怎么实现转换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java对象和Json文本怎么实现转换
    2023-06-29

    java中JSONArray互相转换List怎么实现

    这篇文章主要讲解了“java中JSONArray互相转换List怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java中JSONArray互相转换List怎么实现”吧!1:JSONA
    2023-07-02

    Java实现多叉树和二叉树之间的互转

    本文主要介绍了Java实现多叉树和二叉树之间的互转,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-19

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录