java DTO对象与PO对象的相互转换
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对象的相互转换相关推荐
- 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 ...
- java常见业务对象_Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分...
PO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数 ...
- java中几种常用的对象类型(po,vo,bo,dto)
PO(persistant object) 1.持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了. 2.通常对应数据模型(数据库),本身还有部分业务逻辑的处理.可以看 ...
- java 数据对象_java的几种对象(PO,VO,DAO,BO,POJO)
一.PO persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...
- java vo对象转bo对象_java的几种对象(PO,VO,DAO,BO,POJO)解释(转)
PO:persistant object持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合. PO中应该不包含任何对数据库 ...
- Java中的几种对象(PO、VO、DAO、BO、POJO)
1.VO PO O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写.通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据.在O/R Mappin ...
- Java数据库表自动转化为PO对象
本程序简单实现了数据库内省,生成PO对象. 数据库内省有如下两种实现方式: 通过mysql元表 通过desc table,show tables等命令 import java.io.IOExcepti ...
- Spring项目中,为什么要区分PO对象,VO对象,DTO对象?有什么作用?
相信大家在平时项目中都会用到PO对象,DTO对象,VO对象,但是为什么要区分这几种对象呢?他们分别有什么作用呢? PO对象是指的持久化对象,PO中的字段是和数据库表中的字段一一对应的,一般是DAO层或 ...
- java对象和字符串转换_java中字符串和JSON对象、Bean之间的相互转换
JSON格式用于数据传输.bean用于封装数据信息.String用于展示封装信息.json格式的内容用json工具或者之间在json.cn展示比较清晰. 一.将Sting转为Json 在开发中,经常是 ...
最新文章
- 学习笔记——sklearn监督学习:回归(简单数学知识罗列)
- 深圳大学计算机课程表2018,深圳大学国际交流学院2017—2018学年第1学期本科生课程表...
- jquery数据折叠_通过位折叠缩小大数据
- BugkuCTF-Reverse题Timer(阿里CTF)
- MYSQL数据库安装记
- 第6章 访问权限控制
- 服务器上安装python anaconda最简明教程
- CS61c Fall 2019 project1
- 网站SEO优化:遇到死链接就这样解决
- Android仿人人客户端(v5.7.1)——新鲜事之状态
- 对话窗口、面板滚动视图、标签切换视图;QDialog、QScroollArea、
- @程序员:今日七夕,宜找对象
- matlab dvb,DVB-T OFDM Matlab仿真的整理和疑问
- 用html实现抽奖大转盘,【项目实战】用CSS实现一个抽奖转盘(附详细代码+思路)...
- 虚拟页式存储管理——页面置换算法及其影响的缺页中断率
- 《代码整洁之道》—第1章1.4节思想流派
- 进程控制块pcb详解
- OpenRASP 初探(三)之 IAST
- MySQL高级系列(四)—— MySQL集群架构
- webshell 提权
热门文章
- ParaView绘制自由水面的等值线图
- Java——nefu
- 微信小程序分享生成海报(自带二维码)+头像+昵称
- php中根据二维数组某个字段的值查找对应的一维数组
- 燃爆朋友圈!中国设计师携手,用海报为武汉加油!
- 腹直肌整体(01):器械卷腹
- 2008年4月28日A股市场存在筑底异样
- 在html语言中的换行标记是指,南开20春学期(1709、1803、1809、1903、1909、2003)《电子商务网页制作》在线作业题目【标准答案】...
- 朱一龙左娜扎右热巴,王栎鑫:我想活成你的样子
- 启明云端分享:出乎意料,原来旋钮屏还可以这么用