深入理解 Domain Objects

DAO (Data Access Object)數(shù)據(jù)訪問對象

  • DAO(Data Access Object)是一個數(shù)據(jù)訪問接口,數(shù)據(jù)訪問:顧名思義就是與數(shù)據(jù)庫打交道。夾在業(yè)務(wù)邏輯與數(shù)據(jù)庫資源中間。
  • 一般在 業(yè)務(wù)邏輯層(Service) 對 數(shù)據(jù)庫(SQL) 的訪問時使用,一般能對SQL進(jìn)行操作。
  • xxxDAO,xxx即為實(shí)體類名(Entity實(shí)體)

其它資料:在核心J2EE模式中是這樣介紹DAO模式的:為了建立一個健壯的J2EE應(yīng)用,應(yīng)該將所有對數(shù)據(jù)源的訪問操作抽象封裝在一個公共API中。用程序設(shè)計(jì)的語言來說,就是建立一個接口,接口中定義了此應(yīng)用程序中將會用到的所有事務(wù)方法。在這個應(yīng)用程序中,當(dāng)需要和數(shù)據(jù)源進(jìn)行交互的時候則使用這個接口,并且編寫一個單獨(dú)的類來實(shí)現(xiàn)這個接口在邏輯上對應(yīng)這個特定的數(shù)據(jù)存儲。
DAO是微軟的第一個面向?qū)ο蟮臄?shù)據(jù)庫接口。DAO對象封閉了Access的Jet函數(shù)。通過Jet函數(shù),它還可以訪問其他的結(jié)構(gòu)化查詢語言(SQL)數(shù)據(jù)庫。

DTO(Data Transfer Object)數(shù)據(jù)傳輸對象

  • 數(shù)據(jù)傳輸對象 DTO (Data Transfer Object),是一種設(shè)計(jì)模式之間傳輸數(shù)據(jù)的軟件應(yīng)用系統(tǒng)。數(shù)據(jù)傳輸目標(biāo)往往是數(shù)據(jù)訪問對象從數(shù)據(jù)庫中檢索數(shù)據(jù)。數(shù)據(jù)傳輸對象與數(shù)據(jù)交互對象或數(shù)據(jù)訪問對象之間的差異是一個以不具有任何行為除了存儲和檢索的數(shù)據(jù)(訪問和存取器)。
  • 最早的目的是為了在EJB的分布式應(yīng)用提供粗力度的數(shù)據(jù)實(shí)體,以減少分布式調(diào)用的次數(shù),從而提高分布式調(diào)用的性能和降低網(wǎng)絡(luò)負(fù)載?,F(xiàn)在更加廣泛的應(yīng)用方式是在 前端(Web)對控制層(Controller)進(jìn)行數(shù)據(jù)傳輸時使用,即前端向后臺提交數(shù)據(jù)。
  • xxxDTO,xxx為業(yè)務(wù)領(lǐng)域相關(guān)的名稱。

DO (Domain Object)領(lǐng)域?qū)ο?/h1>
  • 領(lǐng)域?qū)ο?DO 是從現(xiàn)實(shí)世界中抽象出來的有形或無形的業(yè)務(wù)實(shí)體。在與數(shù)據(jù)有關(guān)的操作中數(shù)據(jù)存在數(shù)據(jù)庫使用 DAO訪問被取出來時,一般會將這些數(shù)據(jù)規(guī)范化的定義成類,而這個類就是DO,用來接收數(shù)據(jù)庫對應(yīng)的實(shí)體,它是一種抽象化的數(shù)據(jù)狀態(tài),介于數(shù)據(jù)庫與業(yè)務(wù)邏輯之間。
  • 一般在 業(yè)務(wù)邏輯層(Service) 對 數(shù)據(jù)庫(SQL) 的 訪問時 接收數(shù)據(jù) 使用。
  • xxxDO,xxx即為數(shù)據(jù)表名
    另外:DO與Entity概念上淺顯的相同,他們在實(shí)際應(yīng)用中是一個東西。稍微的不同點(diǎn)就是DO是與數(shù)據(jù)庫存在著某種映射關(guān)系的Entity,總的來說DO是Entity的一種。

VO(View Object)視圖模型

  • VO是顯示視圖模型,視圖對象,用于展示層,它的作用是把某個指定頁面(或組件)的所有數(shù)據(jù)封裝起來。如果是一個DTO對應(yīng)一個VO,則DTO=VO;但是如果一個DTO對應(yīng)多個VO,則展示層需要把VO轉(zhuǎn)換為服務(wù)層對應(yīng)方法所要求的DTO,傳送給服務(wù)層。從而達(dá)到服務(wù)層與展示層解耦的效果。
  • 一般用在業(yè)務(wù)邏輯層(Service) 對 前端(Web) 的 視圖模型效果控制的展示上,說白了就是后臺向前端傳輸數(shù)據(jù)。
  • xxxVO,xxx一般為網(wǎng)頁名稱。

AO(Application Object)應(yīng)用對象

  • AO是一個較為籠統(tǒng)的概念,因?yàn)樘^于常見而并沒有刻意的去描繪它的細(xì)節(jié)。舉一個很簡單的栗子:控制層(Controller) 在 業(yè)務(wù)邏輯層(Service) 查詢一條或多條數(shù)據(jù),這個數(shù)據(jù)的傳輸過程的運(yùn)載就是AO完成。在正常的業(yè)務(wù)邏輯中一般都有很多種類型的數(shù)據(jù),例如 整形、字符型、集合、類 等,我們把它統(tǒng)稱為AO。
  • 控制層(Controller)業(yè)務(wù)邏輯層(Service)層之間抽象的復(fù)用對象模型,有時候極為貼近展示層,復(fù)用度不高。

BO( Business Object)業(yè)務(wù)對象

  • 業(yè)務(wù)對象(Business Object,BO)是對數(shù)據(jù)進(jìn)行檢索和處理的組件。主要作用是把業(yè)務(wù)邏輯封裝為一個對象。這個對象可以包括一個或多個其它的對象。形象描述為一個對象的形為和動作,當(dāng)然也有涉及到基它對象的一些形為和動作。
  • 一般用在包含業(yè)務(wù)功能模塊 的具體實(shí)例上,比如我們寫了一個Controller、一個Service、一個DAO、一個工具類等等這一系列實(shí)例組合后能實(shí)現(xiàn)一些功能,這些一系列實(shí)例組合為一個組件,這個組件就是BO。

其它資料:是簡單的真實(shí)世界的軟件抽象。業(yè)務(wù)對象通常位于中間層或者業(yè)務(wù)邏輯層。BO支持序列化和反序列化,可以輕易地將BO的Java實(shí)例轉(zhuǎn)換為一個XML文件或者一個流保存起來,并且在需要的時候,將這個BO從XML或者流中轉(zhuǎn)換回一個Java實(shí)例。

POJO( Plain Ordinary Java Object)純普通Java對象

  • 總的來說POJO包含DO、DTO、BO、VO,這些本質(zhì)上都是一個簡單的java對象,實(shí)際就是普通JavaBeans,是為了避免和EJB混淆所創(chuàng)造的簡稱
  • 使用POJO名稱是為了避免和EJB混淆起來, 而且簡稱比較直接.。其中有一些屬性及其getter setter方法的類,沒有業(yè)務(wù)邏輯,有時可以作為VO(value -object)或dto(Data Transform Object)來使用.當(dāng)然,這里特意說明純普通Java對象,如果你有一個簡單的運(yùn)算屬性也是可以的,但不允許有業(yè)務(wù)方法,也不能攜帶有connection之類的方法。

PO(Persistent Object)持久化對象

  • 數(shù)據(jù)庫表中的記錄在java對象中的顯示狀態(tài)。最形象的理解就是一個PO就是數(shù)據(jù)庫中的一條記錄。
    好處是可以把一條記錄作為一個對象處理,可以方便的轉(zhuǎn)為其它對象。
  • 例如我們有一條數(shù)據(jù),現(xiàn)在有一個簡單類而且已經(jīng)是被賦予了這條數(shù)據(jù)的實(shí)例,那么目前這條數(shù)據(jù)在這個簡單類的存在狀態(tài)就是PO,不管這個簡單類是DO還是BO還是其他。PO只是數(shù)據(jù)持久化的一個狀態(tài)。

Entity(應(yīng)用程序域中的一個概念)實(shí)體

  • ADO .NET Entity Framework 應(yīng)用程序域中的一個概念,數(shù)據(jù)類型在該域中定義。
  • 在計(jì)算機(jī)網(wǎng)絡(luò)中,實(shí)體這一較為抽象的名詞表示任何可能發(fā)送或接受信息的硬件或軟件進(jìn)程。在許多情況下,實(shí)體就是一個特定的軟件模塊。
  • 說白了Eitity是一個未被持久化的對象,它是一個類,從現(xiàn)實(shí)抽象到代碼的一個類。

Model (概念實(shí)體模型)實(shí)體類和模型

  • Model是計(jì)算機(jī)程序設(shè)計(jì)中有兩個概念:一個是三層架構(gòu)中的實(shí)體類,另一個是MVC架構(gòu)中的模型。
  • 在“三層架構(gòu)”中,為了面向?qū)ο缶幊蹋瑢⒏鲗觽鬟f的數(shù)據(jù)封裝成實(shí)體類,便于數(shù)據(jù)傳遞和提高可讀性。
  • 在MVC(模型Model-視圖View-控制器Controller)模式中,Model代表模型,是業(yè)務(wù)流程/狀態(tài)的處理以及業(yè)務(wù)規(guī)則的制定,接受視圖請求的數(shù)據(jù),并返回最終的處理結(jié)果。業(yè)務(wù)模型的設(shè)計(jì)可以說是MVC最主要的核心。

View (概念視圖模型)視圖模型

  • 在MVC(模型Model-視圖View-控制器Controller)模式中,View代表視圖,用來解析Model帶來的數(shù)據(jù)模型,以展示視圖數(shù)據(jù),View的模型覺決定了需要什么樣的Model來對接,相互聯(lián)系。

————————————————
原文鏈接:https://blog.csdn.net/SR02020/article/details/105821816


Example

User table
user_id user_name pass_word create_time dept_id
Persistent Object(PO)

此時實(shí)現(xiàn)這個 class 的 object 對應(yīng)著數(shù)據(jù)庫中的每一條record,那么這個object就是一個PO。(class是用來映射數(shù)據(jù)庫表的類,object是用來影射數(shù)據(jù)庫表里每一行數(shù)據(jù)的對象)

class User {
  private Long userId;
  private String userName;
  private String passWord;
  private LocalDateTime createTime;
  private Long deptId;
  // getter/setter
}
Data Access Object(DAO)

一般多用來作為Mapper,UserMapper 表示用于封裝數(shù)據(jù)庫操作的一個映射對象
數(shù)據(jù)訪問對象,顧名思義是封裝所有對于數(shù)據(jù)訪問CRUD操作的類(內(nèi)容為數(shù)據(jù)庫查詢方法),用來訪問數(shù)據(jù)庫,然后業(yè)務(wù)邏輯可以直接注入DAO對象來使用。

interface/class UserDAO {
  public List<UserVO> getUserByCondition(UserDTO userDto, Page page);
  public User getUserById(Long userId);
  public int deleteUserByBatchIds(List<Long> userIds);
  public int editUser(UserDTO userDto);
  public int addUser(UserDTO userDto);
}

如果出現(xiàn)了公共訪問操作方法,不需要給多個DAO重復(fù)定義,只需要創(chuàng)建一個 BaseMapper 即可,這也是 MybatisPlus 的思路。public interface UserMapper extends BaseMapper<User>

Business Object(BO)

封裝了業(yè)務(wù)邏輯的對象,一般在開發(fā)中,封裝成對象或者復(fù)雜對象,可包含多個類。我們可以理解為一個BO可以包含一個或者多個POs來進(jìn)行自由組合

Data Transfer Object(DTO)& View Object(VO)

這個需要和VO區(qū)分開,比如我們在不同需求下的VOs是不一樣的,那么會有以下

  • Vos
View-Object-1
{
  "userName": "Alan Rickman",
  "passWord": "R.I.P"
}
View-Object-2
{
  "userName": "Alan Rickman",
  "createTime": "1997-06-26"
}
  • DTO
Data-Transfer-Object
{
  "userId": "alan.rickman",
  "userName": "Alan Rickman",
  "passWord": "R.I.P",
  "createTime": "1997-06-26",
  "deptId": "126"
}

此時雖然VO是用的object不一樣,但里面字段都是從DTO中來的,那么我們可以認(rèn)為此時DTO就是一個包含原始數(shù)據(jù)的object


Flow: Http request -> Controller/Provider -> Service -> Database

《阿里巴巴Java開發(fā)規(guī)范》

  • DO(Data Object):此對象與數(shù)據(jù)庫表結(jié)構(gòu)一一對應(yīng),通過 DAO 層向上傳輸數(shù)據(jù)源對象
  • DTO(Data Transfer Object):數(shù)據(jù)傳輸對象,Service 或 Manager 向外傳輸?shù)膶ο?/li>
  • BO(BusinessObject):業(yè)務(wù)對象,由 Service 層輸出的封裝業(yè)務(wù)邏輯的對象
  • AO(ApplicationObject):應(yīng)用對象,在Web層與Service層之間抽象的復(fù)用對象模型, 極為貼近展示層,復(fù)用度不高。
  • VO(View Object):顯示層對象,通常是 Web 向模板渲染引擎層傳輸?shù)膶ο蟆?/li>
  • Query:數(shù)據(jù)查詢對象,各層接收上層的查詢請求。注意超過 2 個參數(shù)的查詢封裝,禁止使用 Map 類來傳輸。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容