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

一、背景

1.领域模型中的实体类分为四种类型:vodto、do、po

二、详细讲解

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

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

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

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

立即学习“Java免费学习笔记(深入)”;

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()+"");        //下面就可以开始转化了,就一行代码        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()+"");        // 转换        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之间的转换怎么实现的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2627345.html

(0)
上一篇 2025年3月7日 01:03:19
下一篇 2025年2月26日 15:22:20

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论