JAVA進階:VO(DTO)與PO(DAO)之間的轉換
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.
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屬性的時候達到自己的要求,如:
/** //*
* 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中則可能是此物件的全部屬性。其中的一些轉換則需要依據前臺需要針對性地處理啦!
Reference: Apache DOC and <>
相關文章
- Java中PO、DO、TO、DTO、 VO、 BO、POJO 、DAO的概念JavaPOJO
- PO/POJO/BO/DTO/VO/DAO的區別POJO
- Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念JavaPOJO
- java的幾種物件(PO,VO,DAO,BO,POJO,DTO)解釋Java物件POJO
- 概念POJO、DTO、DAO、PO、BO、VO、ENTITY詳解POJO
- 詳述 PO VO BO DTO DAO 和 POJO 的概念及區別POJO
- java的(PO,VO,TO,BO,DAO,POJO)解釋JavaPOJO
- Java開發中的幾種物件的說明(PO,VO,DTO,BO,POJO,DAO,SAO等)Java物件POJO
- 專案中DO、PO、BO,DTO、VO的概念與意義
- 淺析VO、DTO、DO、PO的概念、區別和用處
- 一款 IDEA 外掛幫你優雅轉化 DTO、VO、BO、PO、DOIdea
- 轉載:領域模型中的實體類分為四種型別:VO、DTO、DO、PO模型型別
- PO,VO 之懶載入疑問
- vo bo dto pojo(entity)POJO
- 後端開發基礎概念 Entity,DAO,DO,DTO,VO, Service,Controller後端Controller
- session bean + dao +vo ???SessionBean
- Java中Array與ArrayList之間的轉換Java
- Java之時間轉換Java
- NSData與UIImage之間的轉換UI
- VO(檢視模型) 與 DTO(資料傳輸物件)的區別模型物件
- 解放雙手,自動生成“x.set(y.get)”,搞定vo2dto轉換
- java編碼之間轉換Java
- 前端入門16-JavaScript進階之EC和VO前端JavaScript
- ANSI與UTF8之間的轉換!std::string與UTF8之間的轉換
- Java--包裝類(基本型別和字串之間的轉換)、進位制轉換Java型別字串
- rowid與10進位制和2進位制之間的轉換
- [轉] jQuery物件與DOM物件之間的轉換jQuery物件
- Java 資料型別之間的轉換Java資料型別
- 我寫了個IDEA開源外掛,vo2dto 一鍵生成物件轉換Idea物件
- Python不同進位制之間的轉換Python
- mysql時間與字串之間相互轉換MySql字串
- spark: RDD與DataFrame之間的相互轉換Spark
- 字串與資料流之間的轉換字串
- Jquery 陣列與字串之間的轉換jQuery陣列字串
- java時間的轉換Java
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- java基本型別和物件之間的轉換Java型別物件
- java RSA公私鑰與其base64編碼之間的轉換Java