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对象的相互转换的更多相关文章

  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. tomcat用redis做session共享

    在context.xml添加以下配置: <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerVa ...

  2. 「luogu4462」[CQOI2018] 异或序列

    「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...

  3. 在OS X 10.9配置WebDAV服务器联合NSURLSessionUploadTask实现文件上传

    iOS7推出的NSURLSession简化了NSURLConnection的文件上传和下载的工作,本文记录如何配置WebDAV服务以支持PUT方式的文件上传. 一. 配置WebDAV服务器 1. 修改 ...

  4. 分组PARTITION BY及游标CURSOR的用法

    基础数据表: select * from dbo.RecommendationChanelVersionRelation: 数据如下: 要求按照ChannelVersionID分组,对每组中的Orde ...

  5. 【原创】大叔经验分享(51)docker报错Exited (137)

    docker container启动失败,报错:Exited (137) *** ago,比如 Exited (137) 16 seconds ago 这时通过docker logs查不到任何日志,从 ...

  6. Java的慢和稳

    对Java的了解还有待进一步提升,也没有做太多实践工作.只是把脑袋当成电脑,把Java放在里边不停地转,观察它的线路.得到的总体印象加上书本参考,认为Java的应用场景是慢和稳. 学编程语言总会接触到 ...

  7. MySQL存储过程中的事务执行失败之后获取错误信息

    1.表结构: 2. 存储过程中: 代码如下: BEGINDECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINROLLBACK;GET DIAGNOSTICS C ...

  8. Docker----起步(2)----在Ubuntu上安装最新版的Docker CE

    之前写了一篇文章关于Docker安装的博客,最近再次使用的时候,在docker的官方文档上发现最新版本的Docker(V18.03)的安装方式和之前有点区别,有一些命令发现不能用了.(真的是一天不学习 ...

  9. docker bulid命令

    使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1. docker build -t runoob/ubuntu:v1 . 使用URL github.com/cr ...

  10. Scyther

    1.Security Protocol  :a domain  analysis 一个安全协议描述了很多的行为,每一个行为称为角色,例如触发角色和 接受角色,一个系统有多个通信代理组成,每一个代理扮演 ...