`

VO(DTO)与PO(DAO)之间的转换

 
阅读更多

http://marsvaadin.iteye.com/blog/1294199

 

PO即 Persistence Object
  VO即 Value Object

 VO和PO的主要区别在于:
  VO是独立的Java Object。
  PO是由Hibernate纳入其实体容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反应到实际数据库中。

 实际上,这个VO被用作Data Transfer Object,即所谓的DTO。想必,VO就是Data Access Object ---DAO了啦。为什么要有这二者之分呢?如在传统的MVC架构中,位于Model层的PO,是否允许被传递到其他层面。由于PO的更新最终将被映射到 实际数据库中,如果PO在其他层面(如View层)发生了变动,那么可能会对Model层造成意想不到的破坏。

 主要想说的还是如何进行二者之间的转换:
  属性复制可以通过Apache Jakarta Commons Beanutils(http://jakarta.apache.org/commons/beanutils/ )组件提供的属性批量复制功能,避免繁复的get/set操作。down下来之后,里面的API DOC一应俱全。

 对于一些无需处理其它处理(如过滤)直接用BeanUtilsBean.copyProperties方法,其参考如下:

 

 

Java代码  收藏代码
  1. public static void copyProperties(java.lang.Object dest,  
  2.                                   java.lang.Object orig)  
  3.                            throws java.lang.IllegalAccessException,  
  4.                                   java.lang.reflect.InvocationTargetExceptioCopy property values from the origin bean to the destination bean for all cases where the property names are the same.  

 

Java代码  收藏代码
  1. TUser user  =   new  TUser();  
  2. TUser anotherUser  =   new  TUser();  
  3. user.setName( " Emma " );  
  4. user.setUserType( 1 );  
  5.  try      {  
  6. BeanUtils.copyProperties(anotherUser,user);  
  7. System.out.println( " UserName =>  "   
  8. + anotherUser.getName()  
  9. );  
  10. System.out.println( " UserType =>  "   
  11. +  anotherUser.getUserType()  
  12. );  
  13.  }   catch  (IllegalAccessException e)    {  
  14. e.printStackTrace();  
  15.  }   catch  (InvocationTargetException e)    {  
  16. e.printStackTrace();  
  17. }    

 也可以利用其中的一些方法在copy属性的时候达到自己的要求,如:

 

Java代码  收藏代码
  1. /** //* 
  2.  * Created on 2006-4-26 
  3.  */  
  4. package com.util;  
  5.   
  6. import java.beans.PropertyDescriptor;  
  7. import java.util.Collection;  
  8.   
  9. import org.apache.commons.beanutils.PropertyUtils;  
  10.   
  11. /**   */  
  12. /** 
  13.  * CopyUtil 
  14.  *  
  15.  * @author Jkallen 
  16.  */  
  17. public class CopyUtil {  
  18.   
  19.     /**   */  
  20.     /** 
  21.      * Copy properties of orig to dest Exception the Entity and Collection Type 
  22.      *  
  23.      * @param dest 
  24.      * @param orig 
  25.      * @return the dest bean 
  26.      */  
  27.     public static Object copyProperties(Object dest, Object orig) {  
  28.         if (dest == null || orig == null) {  
  29.             return dest;  
  30.         }  
  31.   
  32.         PropertyDescriptor[] destDesc = PropertyUtils.getPropertyDescriptors(dest);  
  33.         try {  
  34.             for (int i = 0; i < destDesc.length; i++) {  
  35.                 Class destType = destDesc[i].getPropertyType();  
  36.                 Class origType = PropertyUtils.getPropertyType(orig, destDesc[i].getName());  
  37.                 if (destType != null && destType.equals(origType) && !destType.equals(Class.class)) {  
  38.                     if (!Collection.class.isAssignableFrom(origType)) {  
  39.                         try {  
  40.                             Object value = PropertyUtils.getProperty(orig, destDesc[i].getName());  
  41.                             PropertyUtils.setProperty(dest, destDesc[i].getName(), value);  
  42.                         } catch (Exception ex) {}  
  43.                     }  
  44.                 }  
  45.             }  
  46.   
  47.             return dest;  
  48.         } catch (Exception ex) {  
  49.             throw new CopyException(ex);  
  50.             // return dest;  
  51.         }  
  52.     }  
  53.   
  54.     /**   */  
  55.     /** 
  56.      * Copy properties of orig to dest Exception the Entity and Collection Type 
  57.      *  
  58.      * @param dest 
  59.      * @param orig 
  60.      * @param ignores 
  61.      * @return the dest bean 
  62.      */  
  63.     public static Object copyProperties(Object dest, Object orig, String[] ignores) {  
  64.         if (dest == null || orig == null) {  
  65.             return dest;  
  66.         }  
  67.   
  68.         PropertyDescriptor[] destDesc = PropertyUtils.getPropertyDescriptors(dest);  
  69.         try {  
  70.             for (int i = 0; i < destDesc.length; i++) {  
  71.                 if (contains(ignores, destDesc[i].getName())) {  
  72.                     continue;  
  73.                 }  
  74.   
  75.                 Class destType = destDesc[i].getPropertyType();  
  76.                 Class origType = PropertyUtils.getPropertyType(orig, destDesc[i].getName());  
  77.                 if (destType != null && destType.equals(origType) && !destType.equals(Class.class)) {  
  78.                     if (!Collection.class.isAssignableFrom(origType)) {  
  79.                         Object value = PropertyUtils.getProperty(orig, destDesc[i].getName());  
  80.                         PropertyUtils.setProperty(dest, destDesc[i].getName(), value);  
  81.                     }  
  82.                 }  
  83.             }  
  84.   
  85.             return dest;  
  86.         } catch (Exception ex) {  
  87.             throw new CopyException(ex);  
  88.         }  
  89.     }  
  90.   
  91.     static boolean contains(String[] ignores, String name) {  
  92.         boolean ignored = false;  
  93.         for (int j = 0; ignores != null && j < ignores.length; j++) {  
  94.             if (ignores[j].equals(name)) {  
  95.                 ignored = true;  
  96.                 break;  
  97.             }  
  98.         }  
  99.   
  100.         return ignored;  
  101.     }  
  102. }  

 可以看到,在范例1中通过方法copyProperties的时候,二者之间在的属性名必须相同(Copy property values from the origin bean to the destination bean for all cases where the property names are the same)。而在范例2中通过

   Object value = PropertyUtils.getProperty(orig, destDesc[i].getName());
    PropertyUtils.setProperty(dest, destDesc[i].getName(), value);
  也是将源与目的之间copy相同的属性名。而VO是在前台显示,所以难免会用到PO中所不存在的属性值。比如PO中可能是一个对象,而VO中则可能是此对象的全部属性。其中的一些转换则需要依据前台需要针对性地处理啦!

Reference:  Apache DOC and <>  

分享到:
评论

相关推荐

    java术语(PO/POJO/VO/BO/DAO/DTO)

    本文将详细解析"PO/POJO/VO/BO/DAO/DTO"这六个概念,并探讨它们在实际项目开发中的作用和应用场景。 1. PO(Persistent Object,持久化对象) PO是指与数据库表结构一一对应的Java对象,它通常包含了数据库表中的...

    Java中 PO VO BO DTO DAO 和 POJO 关系图

    Java中 PO VO BO DTO DAO 和 POJO 关系图

    po vo dto bo to

    ### Java中的PO、VO、TO、BO、...PO、VO、TO、BO、DAO与POJO各自在系统架构的不同层次中扮演着不同的角色,相互之间既有联系又有区别。理解这些对象的概念及其应用场景,有助于我们在开发过程中做出更合适的设计选择。

    vo bo po dto dao区别

    本人以前搞不懂这些o的区别,特意查找资料总结了一下,希望也可以帮到其他人

    VO / DTO / BO / ORM DAO entity DO PO/ POJO(分层领域模型规约)整理

    本文将详细介绍VO (View Object)、DTO (Data Transfer Object)、BO (Business Object)、ORM (Object Relational Mapping)、DAO (Data Access Object)、Entity (实体)、DO (Data Object)、PO (Persistent Object)、...

    Java的(PO,VO,TO,BO,DAO,POJO)解释

    VO在Web上传递中也可以和DTO(数据传输对象)混淆,但它们之间有一些细微的区别。 TO(Transfer Object)数据传输对象 TO是Java中的数据传输对象,在应用程序不同关系之间传输的对象。TO通常用于数据的传输和交换,...

    POBOVODTOPOJODAO.zip_dto_java dto dao_java vo_qovod

    PO可以严格对应数据库表,一张表对映一个PO。... VO:value object值对象、view object视图对象 PO:持久对象 QO:查询对象 DAO:数据访问对象——同时还有DAO模式 DTO:数据传输对象——同时还有DTO模式

    Java的几种对象(PO-VO-DAO-BO-POJO)解释

    值对象(Value Object,简称VO),通常用于业务层之间的数据传递,与PO类似,它也仅包含数据。但是,VO更倾向于抽象出具体的业务对象,可以根据实际业务需求选择是否与数据库表进行对应。在Web开发中,VO经常被用作...

    java中PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn的理解

    Java 中 PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn 的理解 PO(Persistent Object):持久对象,指的是在 O/R Mapping 中将对象与关系数据库绑定的对象。PO 是由一组属性和属性的 get 和 set 方法组成。它...

    java名词的相关解释

    8. **O/R Mapper**:对象关系映射器,如Hibernate,它根据预先定义的映射规则,自动处理对象与数据库之间的转换,包括生成SQL语句、执行SQL和处理结果集。 这些名词在Java开发中扮演着不同的角色,理解它们的含义和...

    EX快速开发一个功能.docx

    - **POJO(Plain Ordinary Java Object)**:简单的Java对象,纯粹的Java类,只有属性和getter、setter方法,无特定框架依赖,可以作为VO或DTO(Data Transfer Object)使用,用于不同层之间数据的传输。 3. **...

    MVC设计模式

    #### 五、PO/VO/DAO/BO/DTO的区分 - **PO (Persistant Object)**:持久化对象,用来表示数据库表中的记录,每个PO对象对应一条数据库记录。 - **VO (Value Object)**:值对象,用于业务逻辑层中的数据传递。VO更多...

    java8源码-ICS:SpringCloud项目集成

    java8 源码 ICS项目 模型篇 请求出入参 请求入参 所有Controller入参,一律使用 DTO结尾进行交互 所有 DTO 命名,前面采用驼峰命名,后面DTO大写 所有DTO内参数,如果是一组,请用List&lt;...所有PO对象,放置在子模块dao

    Blog:充当日常笔记或者个人博客吧

    Nginx配置文件详解Linux 安装JenkinsJAVA 多线程详解java 多线程学习How to create a Hello World with IntelliJ and Aspect JJava各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分Java finally...

    tim-root:基于Spring引导构建Spring Cloud项目

    common-dto:数据交互层(VO、PO、BO、DTO等) service-user:用户服务提供者(用户注册、登录、权限等) operation-system:运营系统(服务消费者) 集成技术 spring spring mvc spring boot spring boot actuator...

    基于SOA和ROA的整体技术架构.docx

    - **POJO (Plain Ordinary Java Object)**:简单的Java对象,可以在不同阶段转化为PO、DTO、VO等。 - **PO (Persistant Object)**:对应数据库实体的持久化对象。 - **VO (View Object)**:用于表示层的对象,...

    knowledge

    应用对象,Web层和Service层之间抽象的复用对象 VO View Object 显示层对象,Web向模板传输的对象 Query 数据查询对象 各层接收上层的查询请求 个人使用 简写 全写 说明 DO Data Object 数据库表映射类,DAO层向上...

    Java编程规约.pdf

    - 类名采用UpperCamelCase风格,例如DO(Data Object)、BO(Business Object)、DTO(Data Transfer Object)、VO(View Object)、AO(Application Object)、PO(Persistent Object)、UID(User ID)为特例。...

    基于SOA和ROA的整体技术架构(doc 11页).pdf

    在这种模式下,BO(Business Object)、DAO(Data Access Object)、PO(Persistent Object)、VO(View Object)和DTO(Data Transfer Object)等对象分别承担不同的职责。例如,BO封装业务逻辑,DAO负责数据库访问...

Global site tag (gtag.js) - Google Analytics