技術公眾號:Java In Mind(Java_In_Mind),歡迎關注!
背景
我相信,剛開始學習接觸企業代碼的時候,一定會發現,工程中充斥著各種XO:DO、VO、DTO、DAO,還有各種名詞:POJO,JavaBean,Domain等等,這些貌似看起來都一樣,又好像用在不同的地方,記得之前一個前端同事調侃說:“我不想學Java,各種OOO,腦殼疼!”,這里結合自己的理解對這幾個名詞做些介紹。
何為POJO
POJO(Plain Ordinary Java Object),即簡單Java對象,就是一個我們最常見的普通Java對象,這個概念是被大家叫出來的,它具有一些屬性,然后提供對應的getter和setter,如下:
public class Foo {
private String name;
private String type;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public String getType(){
return this.Type;
}
public void setType(String type){
this.type = type;
}
}
何為JavaBean
JavaBean,可序列化的POJO,sun在早期有對其規范(JavaBeans Spec),它是Java中的可重用組件,主要規范約定如下:JavaBean為公共類,并且具有一個空構造函數
所有屬性為私有屬性,提供getter和setter,不應該有公共屬性
實現序列化接口:java.io.Serializable
JavaBean已經成為Java的一種規范,也是Java社區的共同語言,許多工具框架也是遵循JavaBean的規范的,例如,Spring的BeanUtils,一些Json工具都是基于JavaBean的規范來實現的,這些都是基于約定,所以也有人把JavaBean叫為可以持久化的POJO。
何為DO
DO(Domain Object),領域對象,也就是ORM框架中對應數據庫的對象,業務實體,例如,對現實世界中的用戶建模,抽象出來的DO可以叫為UserDO,通常情況下它用于與數據庫的數據交互,通常也是一個JavaBean。
何為PO
PO(Persistent Object),持久化對象,主要用于持久化層,與數據庫對應,通常也是ORM框架中的實體對象,例如,使用JPA時候的Entity與數據庫表做映射,通常是一個JavaBean。
何為DTO
DTO(Data Transfer Object),數據傳輸對象,顧名思義就是用于傳輸數據的對象,通常用于處于不同架構層次或者不同子系統之間的數據傳遞,或者用于外部接口參數傳遞,以便提供不同粒度不同信息的數據,以免造成困惑干擾,通常也是一個JavaBean。
何為VO
VO(Value Object),就是用于保存數據的對象;在提供給頁面使用的時候,也有人解釋為View Object,就是對應頁面展示數據的對象。
何為DAO
DAO(Data Access Object),數據訪問對象,與數據庫做交互的對象,提供不同的接口訪問數據庫來實現對數據庫的操作,而接口使用的數據交互通常就是PO或者DO,通過它可以使用面向對象的方式來與數據庫交互。
總結DO、PO、VO、DTO等其實都是一個JavaBean,只是應用的范圍不同,表示的意義不同,而這些不同是Java這么多年來形成的一種約定,這種習慣形成Java程序員之間一種共識
DO和PO大部分時間是一樣的,不過PO更傾向于有狀態的對象,例如,使用Hibernate的時候,通過DAO操作過的對象會被框架所持有,如果一旦對其操作,在Session關閉的時候會寫回數據庫,這個時候使用PO就要非常小心,特別是與其他業務層交互的時候,最好轉成DTO或者VO提供數據,不能把持久化對象暴露出去,不然可能會導致數據被修改
在使用這類對象的時候,我們還是要明白其意義,然后在合適的場景使用,畢竟這是Java形成的通用語言,想要讀懂他人代碼就要理解,想要他人能讀懂自己的代碼就要遵循