2018-09-27 10:27:50

前言:

  在实际开发中往往需要DTO对象与PO对象的相互转换;

  先说说什么是VO、DTO、DO、PO对象吧,

概念:

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

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

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

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

  下面看个例子:


PO对象Student:       

  1. /**
  2. * @author libo
  3. * @date 2018年9月20日 下午8:44:33
  4. */
  5. public class Student {
  6.  
  7. private Integer id;
  8. private String name;
  9. private Integer age;
  10. private String address;
  11.  
  12. public Integer getId() {
  13. return id;
  14. }
  15. public void setId(Integer id) {
  16. this.id = id;
  17. }
  18. public String getName() {
  19. return name;
  20. }
  21. public void setName(String name) {
  22. this.name = name;
  23. }
  24. public Integer getAge() {
  25. return age;
  26. }
  27. public void setAge(Integer age) {
  28. this.age = age;
  29. }
  30. public String getAddress() {
  31. return address;
  32. }
  33. public void setAddress(String address) {
  34. this.address = address;
  35. }
  36. @Override
  37. public String toString() {
  38. return "Student [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
  39. }
  40.  
  41. }

Student【PO类】

DTO对象StudentDTO:

  1. /**
  2. * @author libo
  3. * @date 2018年9月20日 下午8:45:56
  4. */
  5. public class StudentDTO extends Student{
  6.  
  7. private Integer starAge;
  8. private Integer endAge;
  9.  
  10. public Integer getStarAge() {
  11. return starAge;
  12. }
  13. public void setStarAge(Integer starAge) {
  14. this.starAge = starAge;
  15. }
  16. public Integer getEndAge() {
  17. return endAge;
  18. }
  19. public void setEndAge(Integer endAge) {
  20. this.endAge = endAge;
  21. }
  22. @Override
  23. public String toString() {
  24. return "StudentDTO [starAge=" + starAge + ", endAge=" + endAge + "]"+super.toString();
  25. }
  26.  
  27. }

相信这已经知道了什么是DTO、PO对象了,现在言归正传,通过反射实现相互转换。也就是共有的属性但类型不同的相互转换。赋值给相同属性名的属性中去。

上代码:这里是可以相互转换的,第一个转第二个无论是否DTO

  1. import java.lang.reflect.Field;
  2. import java.lang.reflect.Method;
  3. import java.util.Arrays;
  4. import org.junit.Test;
  5.  
  6. /**
  7. * 通过反射将Po对象转DTO对象
  8. *
  9. * @author libo
  10. * @date 2018年9月20日 下午6:40:07
  11. */
  12. public class PoToDTO {
  13.  
  14. /**
  15. * 将po对象的属性值赋值给dto对象相同属性名的属性
  16. * 此方法能将第一个转第二个无论是否DTO
  17. * @param po 赋值的对象
  18. * @param dto 被赋值的对象
  19. * @return
  20. * @throws Exception
  21. */
  22. public Object poToDto(Object po, Object dto) throws Exception {
  23. Class poClass = po.getClass();
  24. Class dtoClass = dto.getClass();
  25. // 取得po对象的所有属性
  26. Field[] poFields = poClass.getDeclaredFields();
  27. //取父类的所有属性
  28. Field[] superPoFields = poClass.getSuperclass().getDeclaredFields();
  29. //合并数组
  30. poFields = (Field[]) mergeArray(poFields,superPoFields);
  31.  
  32. // 遍历拼接dto的set方法字段表示
  33. for (Field f : poFields) {
  34. String fieldName = f.getName();
  35. //取得当前get,set字符串表达形式
  36. String dtoSetMethodName = "set" + firstToBig(fieldName);
  37. String poGetMethodName = "get"+firstToBig(fieldName);
  38.  
  39. //System.out.println(fieldName + "=====" + dtoSetMethodName);
  40. // 取得DTO对象的set方法
  41. Method dtoSetMethod=null;
  42. try {
  43. dtoSetMethod = dtoClass.getMethod(dtoSetMethodName, f.getType());
  44. }catch (NoSuchMethodException e) {//如果不存在此方法跳过,
  45. continue;
  46. }
  47. //取得Po对象的get方法
  48. Method poGetMethod = poClass.getMethod(poGetMethodName, null);
  49. // 将po对象的属性值set到dto对象中去
  50. dtoSetMethod.invoke(dto, poGetMethod.invoke(po, null));
  51. }
  52. return dto;
  53.  
  54. }
  55.  
  56. /**
  57. * 合并数组
  58. * @param a
  59. * @param b
  60. * @return
  61. */
  62. public Object[] mergeArray(Object[] a,Object[] b) {
  63. Object[] c = Arrays.copyOf(a, a.length+b.length);
  64. System.arraycopy(b, 0, c, a.length, b.length);
  65. return c;
  66. }
  67.  
  68. /**
  69. * 首字母大写
  70. *
  71. * @param fieldName
  72. * @return
  73. */
  74. public String firstToBig(String fieldName) {
  75. if (fieldName != null && fieldName != "") {
  76. fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
  77. }
  78. return fieldName;
  79. }
  80.  
  81. @Test
  82. public void test() {
  83. Student stu = new Student();
  84. stu.setId(1);
  85. stu.setName("李波");
  86. stu.setAge(22);
  87. stu.setAddress("郴州");
  88.  
  89. StudentDTO stuDto = new StudentDTO();
  90. System.out.println("之前===="+stuDto);
  91. try {
  92. stuDto = (StudentDTO) poToDto(stu, stuDto);
  93. System.out.println("之后===="+stuDto);
  94. } catch (Exception e) {
  95. e.printStackTrace();
  96. }
  97. }
  98.  
  99. @Test//测试将dto转po
  100. public void test2() {
  101. StudentDTO stuDTO = new StudentDTO();
  102. stuDTO.setId(1);
  103. stuDTO.setName("李波");
  104. stuDTO.setAge(22);
  105. stuDTO.setAddress("郴州");
  106.  
  107. Student stu = new Student();
  108. Student ss = stuDTO;
  109. System.out.println("之前===="+stu);
  110. try {
  111. stu = (Student) poToDto(stuDTO, stu);
  112. System.out.println("之后===="+stu);
  113. } catch (Exception e) {
  114. e.printStackTrace();
  115. }
  116. }
  117. }

java DTO对象与PO对象的相互转换的更多相关文章

  1. VO对象和PO对象的区别

    VO,值对象(Value Object),PO,持久对象(Persisent Object),它们是由一组属性和属性的get和set方法组成.从结构上看,它们并没有什么不同的地方.但从其意义和本质上来 ...

  2. Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分

    PO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数 ...

  3. Java中各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分

    PO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数 ...

  4. Java开发各层对象含义 PO,VO,DAO,BO,POJO

    java的几种对象(PO,VO,DAO,BO,POJO)解释     一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中 ...

  5. java的几种对象(PO,VO,DAO,BO,POJO)

    一.PO persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...

  6. Java中Vo、Po等对象的解释

    PO:全称是 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:全称是 busines ...

  7. Java数据库表自动转化为PO对象

    本程序简单实现了数据库内省,生成PO对象. 数据库内省有如下两种实现方式: 通过mysql元表 通过desc table,show tables等命令 import java.io.IOExcepti ...

  8. java对象与json对象间的相互转换

    工程中所需的jar包,因为在网上不太好找,所以我将它放到我的网盘里了,如有需要随便下载. 点击下载 1.简单的解析json字符串 首先将json字符串转换为json对象,然后再解析json对象,过程如 ...

  9. JAVA中json转换为集合(对象)之间的相互转换

    字符串转换为json对象: String strResult = RestUtil.getRestContent(url+"/service/peccancy/myOrderList&quo ...

随机推荐

  1. JAVA使用HttpClient时报错:Algorithm constraints check failed on signature algorithm: MD5withRSA

    今天使用httpClient.executeMethod时抛出异常:java.security.cert.CertPathValidatorException: Algorithm constrain ...

  2. SkyReach 团队团队展示

    班级:软件工程1916|W 作业:团队作业第一次-团队展示 团队名称:SkyReach 目标:展示团队风采,磨合团队 队员姓名与学号 队员学号 队员姓名 个人博客地址 备注 221600107 陈某某 ...

  3. 【转】一文掌握 Linux 性能分析之网络篇(续)

    [转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...

  4. js 刷新父业面

    window.opener.location.reload() 2个方法都是刷新父窗口,但是其中还是有奥妙的哦.window.opener.location.reload();这个方法在强迫父窗口的时 ...

  5. 21 re正则模块 垃圾回收机制

    垃圾回收机制 不能被程序访问到的数据,就称之为垃圾 引用计数 引用计数:用来记录值的内存地址被记录的次数的:当一个值的引用计数为0时,该值就会被系统的垃圾回收机制回收 每一次对值地址的引用都可以使该值 ...

  6. node 创建

    下载 node : 注意选项 ADD PATH 配置环境变量 node -v npm -v 检查创建一个服务器 : //创建一个服务器 127.0.0.1:8888 var http = requir ...

  7. echarts-饼状图默认选中高亮

    1.首页需要设置legend legend: { data: ["积极", "负面"], selectedMode: false, show: false } ...

  8. 处理H5新标签方法

    语义化 HTML5中加入了更加具有语义化的标签,比如header,nav,footer等,可以为搜索引擎优化,让爬虫能更好地理解网页结构. 但是对于新标签的兼容性不是很好,IE9以下旧版本不支持新的语 ...

  9. canal-随记001-吐血一个下午找bug

    前天leader说,阿里的新版本canal支持 canal收集binlog直接发到kafka,你要不研究一下? ok,没问题. 昨天周六,在家搭了套环境.解决centos7安装mysql各种小细节,按 ...

  10. keepalived介绍及工作原理

    keepalived介绍keepalived观察其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,它集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防 ...