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 ...
随机推荐
- tomcat用redis做session共享
在context.xml添加以下配置: <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerVa ...
- 「luogu4462」[CQOI2018] 异或序列
「luogu4462」[CQOI2018]异或序列 一句话题意 输入 \(n\) 个数,给定\(k\),共 \(m\) 组询问,输出第 \(i\) 组询问 \(l_i\) \(r_i\) 中有多少个连 ...
- 在OS X 10.9配置WebDAV服务器联合NSURLSessionUploadTask实现文件上传
iOS7推出的NSURLSession简化了NSURLConnection的文件上传和下载的工作,本文记录如何配置WebDAV服务以支持PUT方式的文件上传. 一. 配置WebDAV服务器 1. 修改 ...
- 分组PARTITION BY及游标CURSOR的用法
基础数据表: select * from dbo.RecommendationChanelVersionRelation: 数据如下: 要求按照ChannelVersionID分组,对每组中的Orde ...
- 【原创】大叔经验分享(51)docker报错Exited (137)
docker container启动失败,报错:Exited (137) *** ago,比如 Exited (137) 16 seconds ago 这时通过docker logs查不到任何日志,从 ...
- Java的慢和稳
对Java的了解还有待进一步提升,也没有做太多实践工作.只是把脑袋当成电脑,把Java放在里边不停地转,观察它的线路.得到的总体印象加上书本参考,认为Java的应用场景是慢和稳. 学编程语言总会接触到 ...
- MySQL存储过程中的事务执行失败之后获取错误信息
1.表结构: 2. 存储过程中: 代码如下: BEGINDECLARE CONTINUE HANDLER FOR SQLEXCEPTIONBEGINROLLBACK;GET DIAGNOSTICS C ...
- Docker----起步(2)----在Ubuntu上安装最新版的Docker CE
之前写了一篇文章关于Docker安装的博客,最近再次使用的时候,在docker的官方文档上发现最新版本的Docker(V18.03)的安装方式和之前有点区别,有一些命令发现不能用了.(真的是一天不学习 ...
- docker bulid命令
使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1. docker build -t runoob/ubuntu:v1 . 使用URL github.com/cr ...
- Scyther
1.Security Protocol :a domain analysis 一个安全协议描述了很多的行为,每一个行为称为角色,例如触发角色和 接受角色,一个系统有多个通信代理组成,每一个代理扮演 ...