# 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
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up