java DTO对象与PO对象的相互转换
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:
- /**
- * @author libo
- * @date 2018年9月20日 下午8:44:33
- */
- public class Student {
- private Integer id;
- private String name;
- private Integer age;
- private String address;
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public Integer getAge() {
- return age;
- }
- public void setAge(Integer age) {
- this.age = age;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- @Override
- public String toString() {
- return "Student [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
- }
- }
Student【PO类】
DTO对象StudentDTO:
- /**
- * @author libo
- * @date 2018年9月20日 下午8:45:56
- */
- public class StudentDTO extends Student{
- private Integer starAge;
- private Integer endAge;
- public Integer getStarAge() {
- return starAge;
- }
- public void setStarAge(Integer starAge) {
- this.starAge = starAge;
- }
- public Integer getEndAge() {
- return endAge;
- }
- public void setEndAge(Integer endAge) {
- this.endAge = endAge;
- }
- @Override
- public String toString() {
- return "StudentDTO [starAge=" + starAge + ", endAge=" + endAge + "]"+super.toString();
- }
- }
相信这已经知道了什么是DTO、PO对象了,现在言归正传,通过反射实现相互转换。也就是共有的属性但类型不同的相互转换。赋值给相同属性名的属性中去。
上代码:这里是可以相互转换的,第一个转第二个无论是否DTO
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.util.Arrays;
- import org.junit.Test;
- /**
- * 通过反射将Po对象转DTO对象
- *
- * @author libo
- * @date 2018年9月20日 下午6:40:07
- */
- public class PoToDTO {
- /**
- * 将po对象的属性值赋值给dto对象相同属性名的属性
- * 此方法能将第一个转第二个无论是否DTO
- * @param po 赋值的对象
- * @param dto 被赋值的对象
- * @return
- * @throws Exception
- */
- public Object poToDto(Object po, Object dto) throws Exception {
- Class poClass = po.getClass();
- Class dtoClass = dto.getClass();
- // 取得po对象的所有属性
- Field[] poFields = poClass.getDeclaredFields();
- //取父类的所有属性
- Field[] superPoFields = poClass.getSuperclass().getDeclaredFields();
- //合并数组
- poFields = (Field[]) mergeArray(poFields,superPoFields);
- // 遍历拼接dto的set方法字段表示
- for (Field f : poFields) {
- String fieldName = f.getName();
- //取得当前get,set字符串表达形式
- String dtoSetMethodName = "set" + firstToBig(fieldName);
- String poGetMethodName = "get"+firstToBig(fieldName);
- //System.out.println(fieldName + "=====" + dtoSetMethodName);
- // 取得DTO对象的set方法
- Method dtoSetMethod=null;
- try {
- dtoSetMethod = dtoClass.getMethod(dtoSetMethodName, f.getType());
- }catch (NoSuchMethodException e) {//如果不存在此方法跳过,
- continue;
- }
- //取得Po对象的get方法
- Method poGetMethod = poClass.getMethod(poGetMethodName, null);
- // 将po对象的属性值set到dto对象中去
- dtoSetMethod.invoke(dto, poGetMethod.invoke(po, null));
- }
- return dto;
- }
- /**
- * 合并数组
- * @param a
- * @param b
- * @return
- */
- public Object[] mergeArray(Object[] a,Object[] b) {
- Object[] c = Arrays.copyOf(a, a.length+b.length);
- System.arraycopy(b, 0, c, a.length, b.length);
- return c;
- }
- /**
- * 首字母大写
- *
- * @param fieldName
- * @return
- */
- public String firstToBig(String fieldName) {
- if (fieldName != null && fieldName != "") {
- fieldName = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
- }
- return fieldName;
- }
- @Test
- public void test() {
- Student stu = new Student();
- stu.setId(1);
- stu.setName("李波");
- stu.setAge(22);
- stu.setAddress("郴州");
- StudentDTO stuDto = new StudentDTO();
- System.out.println("之前===="+stuDto);
- try {
- stuDto = (StudentDTO) poToDto(stu, stuDto);
- System.out.println("之后===="+stuDto);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- @Test//测试将dto转po
- public void test2() {
- StudentDTO stuDTO = new StudentDTO();
- stuDTO.setId(1);
- stuDTO.setName("李波");
- stuDTO.setAge(22);
- stuDTO.setAddress("郴州");
- Student stu = new Student();
- Student ss = stuDTO;
- System.out.println("之前===="+stu);
- try {
- stu = (Student) poToDto(stuDTO, stu);
- System.out.println("之后===="+stu);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
java DTO对象与PO对象的相互转换的更多相关文章
- VO对象和PO对象的区别
VO,值对象(Value Object),PO,持久对象(Persisent Object),它们是由一组属性和属性的get和set方法组成.从结构上看,它们并没有什么不同的地方.但从其意义和本质上来 ...
- Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
PO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数 ...
- Java中各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分
PO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数 ...
- Java开发各层对象含义 PO,VO,DAO,BO,POJO
java的几种对象(PO,VO,DAO,BO,POJO)解释 一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中 ...
- java的几种对象(PO,VO,DAO,BO,POJO)
一.PO persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最简单的PO就是对应数据库中某个表中的一条记录,多个记录可以用PO的集合.PO中应该不包含任何对数 ...
- Java中Vo、Po等对象的解释
PO:全称是 persistant object持久对象 最形象的理解就是一个PO就是数据库中的一条记录. 好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象. BO:全称是 busines ...
- Java数据库表自动转化为PO对象
本程序简单实现了数据库内省,生成PO对象. 数据库内省有如下两种实现方式: 通过mysql元表 通过desc table,show tables等命令 import java.io.IOExcepti ...
- java对象与json对象间的相互转换
工程中所需的jar包,因为在网上不太好找,所以我将它放到我的网盘里了,如有需要随便下载. 点击下载 1.简单的解析json字符串 首先将json字符串转换为json对象,然后再解析json对象,过程如 ...
- JAVA中json转换为集合(对象)之间的相互转换
字符串转换为json对象: String strResult = RestUtil.getRestContent(url+"/service/peccancy/myOrderList&quo ...
随机推荐
- JAVA使用HttpClient时报错:Algorithm constraints check failed on signature algorithm: MD5withRSA
今天使用httpClient.executeMethod时抛出异常:java.security.cert.CertPathValidatorException: Algorithm constrain ...
- SkyReach 团队团队展示
班级:软件工程1916|W 作业:团队作业第一次-团队展示 团队名称:SkyReach 目标:展示团队风采,磨合团队 队员姓名与学号 队员学号 队员姓名 个人博客地址 备注 221600107 陈某某 ...
- 【转】一文掌握 Linux 性能分析之网络篇(续)
[转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...
- js 刷新父业面
window.opener.location.reload() 2个方法都是刷新父窗口,但是其中还是有奥妙的哦.window.opener.location.reload();这个方法在强迫父窗口的时 ...
- 21 re正则模块 垃圾回收机制
垃圾回收机制 不能被程序访问到的数据,就称之为垃圾 引用计数 引用计数:用来记录值的内存地址被记录的次数的:当一个值的引用计数为0时,该值就会被系统的垃圾回收机制回收 每一次对值地址的引用都可以使该值 ...
- node 创建
下载 node : 注意选项 ADD PATH 配置环境变量 node -v npm -v 检查创建一个服务器 : //创建一个服务器 127.0.0.1:8888 var http = requir ...
- echarts-饼状图默认选中高亮
1.首页需要设置legend legend: { data: ["积极", "负面"], selectedMode: false, show: false } ...
- 处理H5新标签方法
语义化 HTML5中加入了更加具有语义化的标签,比如header,nav,footer等,可以为搜索引擎优化,让爬虫能更好地理解网页结构. 但是对于新标签的兼容性不是很好,IE9以下旧版本不支持新的语 ...
- canal-随记001-吐血一个下午找bug
前天leader说,阿里的新版本canal支持 canal收集binlog直接发到kafka,你要不研究一下? ok,没问题. 昨天周六,在家搭了套环境.解决centos7安装mysql各种小细节,按 ...
- keepalived介绍及工作原理
keepalived介绍keepalived观察其名可知,保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,它集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防 ...