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

原文链接:http://www.blogjava.net/Jkallen/archive/2006/04/26/43290.html

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方法,其参考如下:

public static void copyProperties(java.lang.Object dest,
                                  java.lang.Object orig)
                           throws java.lang.IllegalAccessException,
                                  java.lang.reflect.InvocationTargetExceptioCopy property values from the origin bean to the destination bean for all cases where the property names are the same.


 
  范例1:

TUser user  =   new  TUser();
TUser anotherUser 
=   new  TUser();
user.setName(
" Emma " );
user.setUserType(
1 );
try   {
BeanUtils.copyProperties(anotherUser,user);
System.out.println(
"UserName => "
+anotherUser.getName()
);
System.out.println(
"UserType => "
+ anotherUser.getUserType()
);
}
  catch  (IllegalAccessException e)  {
e.printStackTrace();
}
  catch  (InvocationTargetException e)  {
e.printStackTrace();
}
 



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

 范例2

/**//*
 * Created on 2006-4-26
 
*/

package  com.util;

import  java.beans.PropertyDescriptor;
import  java.util.Collection;

import  org.apache.commons.beanutils.PropertyUtils;


/** */ /**
 * CopyUtil
 * 
@author Jkallen
 
*/

public   class  CopyUtil  {
    
    
/** *//**
     * Copy properties of orig to dest
     * Exception the Entity and Collection Type
     * 
@param dest
     * 
@param orig
     * 
@return the dest bean
     
*/

    
public static Object copyProperties(Object dest, Object orig) {
        
if (dest == null || orig == null{
            
return dest;
        }

        
        PropertyDescriptor[] destDesc 
= PropertyUtils.getPropertyDescriptors(dest);
        
try {
            
for (int i = 0; i < destDesc.length; i++{
                Class destType 
= destDesc[i].getPropertyType();
                Class origType 
= PropertyUtils.getPropertyType(orig, destDesc[i].getName());
                
if(destType != null && destType.equals(origType)
                        
&& !destType.equals(Class.class)) {
                    
if(!Collection.class.isAssignableFrom(origType)){                    
                        
try{
                            Object value 
= PropertyUtils.getProperty(orig, destDesc[i].getName());
                            PropertyUtils.setProperty(dest, destDesc[i].getName(), value);
                        }
catch(Exception ex){                            
                        }

                    }

                }

            }

            
            
return dest;
        }
catch(Exception ex) {
            
throw new CopyException(ex);
//            return dest;
        }

    }
    
    
    
/** *//**
     * Copy properties of orig to dest
     * Exception the Entity and Collection Type
     * 
@param dest
     * 
@param orig
     * 
@param ignores
     * 
@return the dest bean
     
*/

    
public static Object copyProperties(Object dest, Object orig, String[] ignores) {
        
if (dest == null || orig == null{
            
return dest;
        }

        
        PropertyDescriptor[] destDesc 
= PropertyUtils.getPropertyDescriptors(dest);
        
try {
            
for (int i = 0; i < destDesc.length; i++{
                
if (contains(ignores, destDesc[i].getName())) {
                    
continue;
                }

                
                Class destType 
= destDesc[i].getPropertyType();
                Class origType 
= PropertyUtils.getPropertyType(orig, destDesc[i].getName());
                
if(destType != null && destType.equals(origType)
                        
&& !destType.equals(Class.class)) {
                    
if(!Collection.class.isAssignableFrom(origType)){
                        Object value 
= PropertyUtils.getProperty(orig, destDesc[i].getName());
                        PropertyUtils.setProperty(dest, destDesc[i].getName(), value);
                    }

                }

            }

            
            
return dest;
        }
catch(Exception ex) {
            
throw new CopyException(ex);
        }

    }

    
    
static boolean contains(String[] ignores, String name) {
        
boolean ignored = false;
        
for (int j = 0; ignores != null && j < ignores.length; j++{
            
if (ignores[j].equals(name)) {
                ignored 
= true;
                
break;
            }

        }

        
        
return ignored;
    }

}


  

  可以看到,在范例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中则可能是此对象的全部属性。其中的一些转换则需要依据前台需 要针对性地处理啦!
          在copy的过程中,若实体中存在一对多,多对多等关系,则DTO中也应该存在此关系,此时不能直接将内部的DTO or List(一对多)里面的数据一次性全部拷过去,这时应该对每个DTO进行copy,当然,若在前台你无需用到相关的DTO则可以跳过。而对于一对多(LIST),而应将实体里面的每个一对多转换成对应的DTO,再依次放到LSIT里面,再将此LIST赋值给(父)DTO,这里面的关系如同(一个简单的)递归关系。---更新于5-25-2006

Reference:  Apache DOC and <<Hibernate 开发指南>> 

### 回答1: povo、bo、dtodaopojo都是Java编程中常用的缩写词。 - po:通常指持久化对象(Persistent Object),即数据库中的实体类,与数据库中的表一一对应。 - vo:通常指值对象(Value Object),用于封装业务逻辑中的数据,与前端展示相关。 - bo:通常指业务对象(Business Object),用于封装业务逻辑中的数据,与业务逻辑相关。 - dto:通常指数据传输对象(Data Transfer Object),用于在不同层之间传输数据,通常与前端展示无关。 - dao:通常指数据访问对象(Data Access Object),用于封装对数据库的访问,提供对数据库的增删改查操作。 - pojo:通常指普通Java对象(Plain Old Java Object),即普通的Java类,没有继承特定的接口或类,也没有实现特定的方法。 ### 回答2: po vo bo dto daopojo 是软件开发中经常使用的一些概念,用于设计和实现对象模型。下面将分别解释这些概念的含义及其在开发中的应用。 Po是指Persistant object(持久化对象),是映射到数据库表中的Java对象。Po主要用于数据交互,与数据库表结构一一对应,包含了与实体对象映射一一对应的Po实体。在开发中,如果需要进行数据库操作,则需要通过Po实体与数据库进行交互,从而实现对数据的增、删、改、查等操作。 Vo是指Value object(值对象),用于封装特定业务数据。VoPo不同的是,Vo不仅包含了与数据库映射的数据,还包含了其他一些数据字段,例如计算、统计字段等。Vo主要用于业务层的数据处理和交互,封装业务逻辑用于VO来完成,并作为业务组件的数据传递对象。 Bo是指Business object(业务对象),用于封装业务逻辑。Bo封装了特定的业务方法,实现相应的业务功能。Bo通过调用Dao进行持久化操作,或管理多个Bo进行协作完成更复杂的业务逻辑。 Dto是指Data transfer object(数据传输对象),主要用于接口层和远程调用时数据传输的封装。Dto通常包含一些传输时需要的字段,例如查询条件、分页信息等。Dto主要用于数据的传输,不包含业务逻辑。 Dao是指Data access object(数据访问对象),用于将数据访问与业务逻辑分离,Dao通过对Po对象进行CRUD操作,实现与数据库的交互。Dao在进行数据库操作时往往需要配合使用数据访问框架,例如Mybatis、Hibernate等。 Pojo是指Plain Ordinary Java object(简单Java对象),是一种纯粹的Java对象,不依赖于其他任何框架。Pojo一般用于传输数据、封装业务实体等。Pojo和Vo比较相似,但Vo作为业务层的数据传输对象,常常包含业务逻辑,而Pojo则不会。 总之,这些概念在软件开发中的使用是相当普遍的,通过合理地使用这些概念,可以使开发者更加清晰地理解业务的实现方式,增加代码的可读性和可维护性。选择何种概念,最终需要根据具体的业务场景及功能需求决定。 ### 回答3: POVO、BO、DTODAOPOJO都是Java中的术语。 PO指的是“持久化对象”,是用于描述持久化存储模型的Java对象,通常和数据库中的表一一对应。 在ORM(对象关系映射)框架中,PO可以将Java对象映射到数据库中的表,简化了数据的存储和持久化过程。 VO指的是“值对象”,是用于描述值的Java对象,通常是由一个或多个PO组成的。VO通常是用于在不同层之间传递数据的,例如将从数据库中查询出来的PO化成前台可以直接使用的VO,或者将前台传入的VO化成后台PO以进行数据的持久化存储。 BO指的是“业务对象”,是用于描述业务逻辑的Java对象,通常是由对应的多个PO、BO或DTO组成的。BO主要负责处理业务逻辑,可以看成是对PO进行多层封装后产生的对象,也可以是多个PO的组合。 DTO指的是“数据传输对象”,是用于数据传输的Java对象,通常是由一个或多个PO、BO或DTO组成的。DTO主要用于在不同模块之间传输数据,可以对数据进行封装和裁剪。 DAO指的是“数据访问对象”,是用于数据访问的Java对象,通常是负责封装数据访问层的操作,例如对数据库的增删改查等操作。DAO通过提供独立的接口,将访问数据的过程与业务分离,增强了代码的可重用性和可维护性。 POJO指的是“简单Java对象”,是一种不包含业务方法的Java对象,通常是用于封装数据的Java Bean。POJO与Java EE相关性较小,可以将其看成是一种简化的Java类实现方式,适用于需要快速实现业务逻辑的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值