2018-09-27 10:27:50

前言:

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

  先说说什么是DTO对象吧,个人觉得DTO就是PO的扩展而已,PO专门指向数据库,DTO作扩展(字段)。下面看个例子:


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
42 }

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
28 }


相信这已经知道了什么是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 }

转载于:https://www.cnblogs.com/chenzhoulibo/p/9711810.html

java DTO对象与PO对象的相互转换相关推荐

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

    Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分 PO:持久对象 (persistent object),po(persiste ...

  2. java常见业务对象_Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分...

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

  3. java中几种常用的对象类型(po,vo,bo,dto)

    PO(persistant object) 1.持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了.   2.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看 ...

  4. java 数据对象_java的几种对象(PO,VO,DAO,BO,POJO)

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

  5. java vo对象转bo对象_java的几种对象(PO,VO,DAO,BO,POJO)解释(转)

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

  6. Java中的几种对象(PO、VO、DAO、BO、POJO)

    1.VO PO O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mappin ...

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

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

  8. Spring项目中,为什么要区分PO对象,VO对象,DTO对象?有什么作用?

    相信大家在平时项目中都会用到PO对象,DTO对象,VO对象,但是为什么要区分这几种对象呢?他们分别有什么作用呢? PO对象是指的持久化对象,PO中的字段是和数据库表中的字段一一对应的,一般是DAO层或 ...

  9. java对象和字符串转换_java中字符串和JSON对象、Bean之间的相互转换

    JSON格式用于数据传输.bean用于封装数据信息.String用于展示封装信息.json格式的内容用json工具或者之间在json.cn展示比较清晰. 一.将Sting转为Json 在开发中,经常是 ...

最新文章

  1. 学习笔记——sklearn监督学习:回归(简单数学知识罗列)
  2. 深圳大学计算机课程表2018,深圳大学国际交流学院2017—2018学年第1学期本科生课程表...
  3. jquery数据折叠_通过位折叠缩小大数据
  4. BugkuCTF-Reverse题Timer(阿里CTF)
  5. MYSQL数据库安装记
  6. 第6章 访问权限控制
  7. 服务器上安装python anaconda最简明教程
  8. CS61c Fall 2019 project1
  9. 网站SEO优化:遇到死链接就这样解决
  10. Android仿人人客户端(v5.7.1)——新鲜事之状态
  11. 对话窗口、面板滚动视图、标签切换视图;QDialog、QScroollArea、
  12. @程序员:今日七夕,宜找对象
  13. matlab dvb,DVB-T OFDM Matlab仿真的整理和疑问
  14. 用html实现抽奖大转盘,【项目实战】用CSS实现一个抽奖转盘(附详细代码+思路)...
  15. 虚拟页式存储管理——页面置换算法及其影响的缺页中断率
  16. 《代码整洁之道》—第1章1.4节思想流派
  17. 进程控制块pcb详解
  18. OpenRASP 初探(三)之 IAST
  19. MySQL高级系列(四)—— MySQL集群架构
  20. webshell 提权

热门文章

  1. ParaView绘制自由水面的等值线图
  2. Java——nefu
  3. 微信小程序分享生成海报(自带二维码)+头像+昵称
  4. php中根据二维数组某个字段的值查找对应的一维数组
  5. 燃爆朋友圈!中国设计师携手,用海报为武汉加油!
  6. 腹直肌整体(01):器械卷腹
  7. 2008年4月28日A股市场存在筑底异样
  8. 在html语言中的换行标记是指,南开20春学期(1709、1803、1809、1903、1909、2003)《电子商务网页制作》在线作业题目【标准答案】...
  9. 朱一龙左娜扎右热巴,王栎鑫:我想活成你的样子
  10. 启明云端分享:出乎意料,原来旋钮屏还可以这么用