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
- java的幾種物件(PO,VO,DAO,BO,POJO,DTO)解釋Java物件POJO
- 概念POJO、DTO、DAO、PO、BO、VO、ENTITY詳解POJO
- Java開發中的幾種物件的說明(PO,VO,DTO,BO,POJO,DAO,SAO等)Java物件POJO
- PO、VO、DTO、DO等淺析
- POJO、PO、DO、VO、DTO等淺析POJO
- 專案中DO、PO、BO,DTO、VO的概念與意義
- DTO轉VO工具
- VO/DTO/DO/PO通俗的解釋加上自己的理解
- 淺析VO、DTO、DO、PO的概念、區別和用處
- 一款 IDEA 外掛幫你優雅轉化 DTO、VO、BO、PO、DOIdea
- Java | DO / DTO / BO / VO的區別Java
- 轉載:領域模型中的實體類分為四種型別:VO、DTO、DO、PO模型型別
- Java中Array與ArrayList之間的轉換Java
- 後端開發基礎概念 Entity,DAO,DO,DTO,VO, Service,Controller後端Controller
- Java之時間轉換Java
- vo bo dto pojo(entity)POJO
- 第42篇 字元與進位制之間的轉換字元
- python str與bytes之間的轉換Python
- 解放雙手,自動生成“x.set(y.get)”,搞定vo2dto轉換
- Java 中 CLOB 和字串之間的轉換Java字串
- mysql時間與字串之間相互轉換MySql字串
- 我寫了個IDEA開源外掛,vo2dto 一鍵生成物件轉換Idea物件
- VO(檢視模型) 與 DTO(資料傳輸物件)的區別模型物件
- java基本型別和物件之間的轉換Java型別物件
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- JSON 與 Java 物件之間的轉化JSONJava物件
- 前端入門16-JavaScript進階之EC和VO前端JavaScript
- 【Go】IP地址轉換:數字與字串之間高效轉換Go字串
- android中String與InputStream之間的相互轉換方式Android
- Apple開發_NSImage與CIImage之間的相互轉換APP
- WebSocket系列之JavaScript字串如何與二進位制資料間進行互相轉換WebJavaScript字串
- DO、DTO、BO、AO、VO、POJO定義規範POJO
- 一文了解進位制之間的原理和轉換
- Json,String,Map之間的轉換JSON
- 角度和弧度之間的轉換
- 微服務之間如何共享DTO?微服務
- binaascii:A Python 在二進位制和 ASCII 之間轉換ASCIIPython
- String和Date、Timestamp之間的轉換