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

PHPz
PHPz转载
2023-05-05 17:37:07610浏览

    一、背景

    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之间的转换怎么实现的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:亿速云,如有侵犯,请联系admin@php.cn删除
    PHP培训优惠套餐