---
# System prepended metadata

title: DTO、VO、BO、DAO、POJO 各種 Object

---

# DTO、VO、BO、DAO、POJO 各種 Object

![](https://i.imgur.com/Vf05q02.png)

* 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)