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)系。
另外:DO與Entity概念上淺顯的相同,他們在實(shí)際應(yīng)用中是一個東西。稍微的不同點(diǎn)就是DO是與數(shù)據(jù)庫存在著某種映射關(guān)系的Entity,總的來說DO是Entity的一種。
其它資料:是簡單的真實(shí)世界的軟件抽象。業(yè)務(wù)對象通常位于中間層或者業(yè)務(wù)邏輯層。BO支持序列化和反序列化,可以輕易地將BO的Java實(shí)例轉(zhuǎn)換為一個XML文件或者一個流保存起來,并且在需要的時候,將這個BO從XML或者流中轉(zhuǎn)換回一個Java實(shí)例。
好處是可以把一條記錄作為一個對象處理,可以方便的轉(zhuǎ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

《阿里巴巴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 類來傳輸。