博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java DTO对象与PO对象的相互转换
阅读量:4968 次
发布时间:2019-06-12

本文共 5544 字,大约阅读时间需要 18 分钟。

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     @Override37     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     @Override23     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转po100 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

你可能感兴趣的文章
存储设备形成的层次结构
查看>>
查看oracle数据库服务器的名字
查看>>
第1章 单例模式(Single Pattern)
查看>>
JavaScript网站设计实践(四)编写about.html页面,利用JavaScript和DOM,选择性的显示和隐藏DIV元素...
查看>>
silverlight 获取文本框焦点
查看>>
Ubuntu 16.04 几个国内更新源
查看>>
源码阅读 - java.util.concurrent (三)ConcurrentHashMap
查看>>
C语言——第三次作业
查看>>
C++ primer笔记 -基本语言
查看>>
js 获取当前标签 jquery1.11.4
查看>>
解决2.3.x某些系统中listview超出item高度部分灰色背景问题
查看>>
2012暑假集训内部测试赛1
查看>>
CentOS6.8-minimal安装gnome桌面 安装NVC远程桌面连接
查看>>
第二部分 : 简单句的核心变化(时态)
查看>>
Daily Scrum 10.30
查看>>
POJ 2503 单词映射(map)
查看>>
关于Mysql数据库查询数据大小写的问题汇总
查看>>
!HDU 2602 Bone Collector--DP--(裸01背包)
查看>>
Android测试(四)——内容供应器泄露
查看>>
HTML5学习路线资料,HTML5前端面试的技术栈
查看>>