java中VO和DTO之间的转换实现
作者:mingxu.chen
一、背景
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转换 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!