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

目录
  • 一、背景
  • 二、详细讲解
    • 注意
  • 三、实体对象间的转换
  • 四、第一种方法的具体代码例子
  • 五、第二种方法的具体代码例子(使用dozer)
  • 六、结束

一、背景

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.导入依赖

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

2.一个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 +
                '}';
    }
}

3.一个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 +
                '}';
    }
}

4.测试类

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());
    }
}

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.导入依赖

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

2.测试类

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);
    }

}

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

六、结束

到此这篇关于java中VO和DTO之间的转换实现的文章就介绍到这了,更多相关java VO和DTO转换 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java中PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn的理解

    O/R Mapping 是 Object Relational Mapping (对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在 O/R Mapping 的世界里,有两个基本的也是重要的东东需要了解,即 VO , PO . VO ,值对象 (Value Object) , PO ,持久对象 (Persisent Object) ,它们是由一组属性和属性的 get 和 set 方法组成.从结构上看,它们并没有什么不同的地方.但从其意义和本质上来看是完全不同的.

  • java实现相同属性名称及相似类型的pojo、dto、vo等互转操作

    已应用于实际项目: 1.thrift对象与dto之间的互转 2.pojo与dto之间的互转 3.pojo与vo之间的互转 1.核心转换工具类,对特别复杂类型不做处理,因为业务场景还未覆盖 package littlehow.convert; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.Field; import java.lang.reflect.Method; import

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

    目录 一.背景 二.详细讲解 注意 三.实体对象间的转换 四.第一种方法的具体代码例子 五.第二种方法的具体代码例子(使用dozer) 六.结束 一.背景 1.领域模型中的实体类分为四种类型:VO.DTO.DO.PO 二.详细讲解 1.VO(View Object),视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. 2.DTO(Data Transfer Object),数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据

  • Java中父类和子类之间的转换操作示例

    本文实例讲述了Java中父类和子类之间的转换操作.分享给大家供大家参考,具体如下: 一.父类引用强转成为子类引用 package learn20180720; public class People { private String name; private Integer age; private Double height; public People(){ this.name = ""; this.age = 0 ; this.height = 0.0; } public Pe

  • JAVA中list,set,数组之间的转换详解

    JAVA的list,set,数组之间的转换,主要是使用Apache Jakarta Commons Collections,具体的方法如下:import org.apache.commons.collections.CollectionUtils; String[] strArray = {"aaa", "bbb", "ccc"};    List strList = new ArrayList();    Set strSet = new Ha

  • Java 中 Date 与 Calendar 之间的编辑与转换实例详解

    Java语言的Calendar(日历),Date(日期),和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分.日期是商业逻辑计算一个关键的部分.所有的开发者都应该能够计算未来的日期,定制日期的显示格式,并将文本数据解析成日期对象. 下面通过代码给大家介绍Java 中 Date 与 Calendar 之间的编辑与转换. 具体代码如下所述: /** * 移除 Data 中的时间部分 */ public static Date removeTime(Date date)

  • java中VO的使用解析

    目录 java中VO的使用 场景 java里VO是什么 1.PO:persistant object 持久对象 2.VO:value object值对象 java中VO的使用 场景 现在我们需要从数据库中查询用户列表t_user,对应的实体类如下: import io.swagger.annotations.ApiModelProperty; public class User { @ApiModelProperty(value = "用户id") private String use

  • Android中Uri和Path之间的转换的示例代码

    Android中Uri和Path之间的转换 原因 调用系统拍照应用,拍照后要保存图片,那么我们需要指定一个存储图片路径的Uri.这就涉及到如何将file path转换为Uri.有时候我们还需要根据照片的路径得到照片的media Uri,那么又该如何转换呢? Android Uri to Path 现在遇到的常规Uri有两种: 媒体文件的Uri是content://, 表示这是一个数据库数据.去数据库查询正常返回. 其他的文件Uri是file://, 表示这个是一个文件.这个uri是通过Uri.f

  • java实体对象与Map之间的转换工具类代码实例

    这篇文章主要介绍了java实体对象与Map之间的转换工具类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Map接口中键和值一一映射. 可以通过键来获取值. 给定一个键和一个值,你可以将该值存储在一个Map对象. 之后,你可以通过键来访问对应的值. 当访问的值不存在的时候,方法就会抛出一个NoSuchElementException异常. 当对象的类型和Map里元素类型不兼容的时候,就会抛出一个 ClassCastException异常

  • java对象与json对象之间互相转换实现方法示例

    本文实例讲述了java对象与json对象之间互相转换实现方法.分享给大家供大家参考,具体如下: import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import net.sf.json.JSONArray; import net.sf.json.JSONObject; public class MainClass { public st

  • Java中两个大数之间的相关运算及BigInteger代码示例

    Java中两个大数之间的相关运算及BigInteger两段实例代码,具体如下. 大数相减 import java.util.Scanner; /* 进行大数相减,只能对两个正数进行相减 */ public class BigNumber { public static void main(String[] args) { Scanner scan=new Scanner(System.in); String a,b; while (scan.hasNext()) { BigNumber big=

  • python2 中 unicode 和 str 之间的转换及与python3 str 的区别

    在python2中字符串分为 unicode 和 str 类型 Str To Unicode 使用decode(), 解码 Unicode To Str 使用encode(), 编码 返回数据给前端时需要先将unicode转换为str类型, 事实上, python2 中的 str 就是一串字节(byte), 而网络通信时, 传输的就是字节. 如果前端需要接收json数据, 需要使用 json.dumps() 将数据转换为json格式进行返回, 当数据是嵌套类型的数据, 内层的数据可能无法直接转换

随机推荐