# DTO、VO、BO、DAO、POJO 各種 Object  * DAO (data access object): * 用於ORM將資料從資料庫提取的邏輯物件,其中邏輯主要包含如何提取資料庫的資料並且將資料包裝成PO。 * 用來封裝對資料庫的訪問,通過它可以把 POJO 持久化為 PO,用PO去組裝成 DTO、VO。 * 是一個物件導向的 interface,負責持久層的操作,主要用來封裝對數據庫的訪問,常見操作不外乎 CRUD。 * DAO管理著所有的資料訪問細節,所有的實現細節相關的程式碼(比如SQL 語句)都包含在DAO而不在商業物件中. 這樣使得程式碼變的更加健壯而且大大提高了開發效率. * PO (persistent object): * 因為ORM框架的誕生所以才有PO的概念,可以簡單地將它視為資料庫table對應的java物件,通常PO的名詞都會與使用hibernate相關 * PO 不包含任何對數據庫的操作 * 簡單來說就是數據庫的資料 mapping 至 java 的物件 * DTO (Data Transfer Object): * 傳輸用的物件,假設今天我的程式向資料庫提取了PO資料物件,我必須將我的資料傳往其他系統或是服務時則可以用DTO進行再包裝,通常DTO的資訊都會比PO少,因為沒有必要將全部的資料傳輸出去。 * 這個概念來源於J2EE的設計模式,原來的目的是為了EJB的分散式應用提供粗粒度的資料實體,以減少分散式呼叫的次數,從而提高分散式呼叫的效能和降低網路負載,但在這裡,我泛指用於展示層與服務層之間的資料傳輸物件。 * 傳輸用的物件,從資料庫資料經過 orm 取得 PO ,PO -> VO 的傳輸過程就是將 PO 包裝成 DTO ,通常 DTO 的資訊會比 PO 要來的少,因為沒必要將所有的 PO 資訊傳輸出去,一來可以防止表結構暴露,二來效能上也能提升。 * VO (value object): * 用於呈現時的資料包裝,並且將實體的資料(PO)抽象適合當前程式運作的物件,他可以很單純如同PO一樣對應資料庫的屬性,但他也可以包含多個PO組裝成一個較為複雜的資料物件。 * 檢視物件,用於展示層,它的作用是把某個指定頁面(或元件)的所有資料封裝起來。 * VO 的狀態是不可變的 [領域設計:Entity與VO](https://kknews.cc/zh-tw/news/jkrvj6e.html) * 頁面的呈現就是一個 VO,VO可以涵蓋多個 PO * POJO(plain ordinary java object): * POJO : 只需要繼承 Object 就可以,沒有特定規定,只要建立的類別有setter/getter方法都可以稱為POJO * DO、DTO、PO、VO 都屬於 POJO * BO (business object):用於業務層開發的物件,和 PO 和 VO 差別在於BO 包含複雜的業務邏輯,而不再是單純的資料存取或儲存物件。 情景:我們有一張表,表中有10個欄位,那對應的 PO 就有10個屬性 ,然後我們希望頁面上呈現其中的5個欄位資料,我們就會將只有這5個欄位的 DTO 傳送至客戶端(不必傳送整個PO,也不會暴露服務層端的表結構),然後如果用這個物件來對應頁面顯示,此時他的身分就是VO。 * VO:前端到Controller的 Object * DTO:Controller到Service的 Object * BO:Service到Controller的 Object * PO:Service到DAO的 Object * DO:DAO返回給Service的 Object * 使用者發出請求(可能是填寫表單),表單的資料在展示層被匹配為VO。 * 展示層把 VO 轉換為服務層對應方法所要求的DTO,傳送給服務層。 * 服務層首先根據 DTO 的資料構造(或重建)一個 DO,呼叫 DO 的業務方法完成具體業務。 * 服務層把 DO 轉換為持久層對應的 PO(可以使用ORM工具,也可以不用),呼叫持久層的持久化方法,把PO傳遞給它,完成持久化操作。 * 對於一個逆向操作,如讀取資料,也是用類似的方式轉換和傳遞。 ### 參考資料: [ HackMD:一次搞懂POJO、PO、DTO、VO、BO](https://hackmd.io/@MonsterLee/HJyAdgRBB) [IT閱讀:關於各種 O](https://www.itread01.com/content/1545579375.html) [CSDN:講述 PO VO BO DTO DAO 和 POJO 的概念及區別](https://blog.csdn.net/qq_35246620/article/details/77247427)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.