--- tags: 學習計畫 --- # 一次搞懂POJO、PO、DTO、VO、BO ## 前言 在還是學生時,腦袋完全沒有所謂的Bean的觀念,直到進入職場開始使用Spring並且看到物件的命名(PO、DTO、VO、BO)才發現原來每個物件,對於他們的功能都有一個相對的命名,所以就抽空整理網路上看到的資料並且記錄下來,如果內文有錯誤的話煩請高手糾正指導。 ## 主文 ### POJO (Plain Old Java Object) >Martin Fowler、Rebecca Parsons和Josh MacKenzie在2000年的一次一講提出的概念,當初提出的背景是EJB過於複雜,所以想要找一個簡單的方式取代他,而現在也證明他成功了,應為套用POJO概念的Spring已經是Java不可或缺的框架。 #### 定義 簡單並且純粹,POJO就是一個Java物件只包含自己的屬性(private)和提取或儲存這些屬性的method(get、set),而其他的Object也是以POJO為基準開始延伸。 #### 題外話 對於一個進入正式開發階段的Java工程師在工作時常常看到Entity應該都不知道他們的正式名稱就是POJO。 下方參考[Webopedia](https://www.webopedia.com/TERM/P/POJO.html)介紹 >POJO, or Plain Old Java Object, is a normal Java object class (that is, not a JavaBean, EntityBean etc.)  and does not serve any other special role nor does it implement any special interfaces of any of the Java frameworks. This term was coined by Martin Fowler, Rebbecca Parsons and Josh MacKenzie who believed that by creating the acronym POJO, such objects would have a "fancy name", thereby convincing people that they were worthy of use. ### PO (persistent object) #### 定義 因為ORM框架的誕生所以才有PO的概念,可以簡單地將它視為資料庫table對應的java物件,通常PO的名詞都會與使用hibernate相關 ### DTO (Data Transfer Object) #### 定義 傳輸用的物件,假設今天我的程式像資料庫提取了PO資料物件,我必須將我的資料傳往其他系統或是服務時則可以用DTO進行再包裝,通常DTO的資訊都會比PO少,因為沒有必要將全部的資料傳輸出去。 ### VO (value object) #### 定義 用於呈現時的資料包裝,並且將實體的資料(PO)抽象適合當前程式運作的物件,他可以很單純如同PO一樣對應資料庫的屬性,但他也可以包含多個PO組裝成一個較為複雜的資料物件。 ### DAO (data access object) #### 定義 用於ORM(hibernate)將資料從資料庫提取的邏輯物件,其中邏輯主要包含如何提取資料庫的資料(SQL)並且將資料包裝成PO。 ### 題外話 ### BO (business object) #### 定義 用於業務層開發的物件,和PO和VO差別在於BO包含複雜的業務邏輯,而不再是單純的資料存取或儲存物件。 ### 圖解 借用網路上搜尋到的資料我覺得一張圖在看完上面的介紹後,可以馬上了解每個object的差異。 ![](https://i.imgur.com/1JuZ1qI.png) 我們可以看到這張架構圖,在DAO會再持續層對資料庫做資料提取並且和業務層做交換,而在業務層會將PO轉換成BO做程式邏輯的處理,而業務層和服務層則會再次將BO包裝成對應的VO顯示或者DTO傳遞出去。 ## 結論 其實在每秒都在改革的軟體界,要不要堅持這樣的物件命名與規範真的都是見仁見智,因為Spring Data的崛起我也好久沒有寫DAO和PO了,只是前陣子被派去維護一個十年的專案裡面充斥著各種物件名稱,讓我想好好地了解一下這些物件的起源與功能。 ### 參考連結 [https://www.zhihu.com/question/19773379](https://www.zhihu.com/question/19773379) [https://zhuanlan.zhihu.com/p/35762537](https://zhuanlan.zhihu.com/p/35762537) [https://blog.csdn.net/chenchunlin526/article/details/6993933](https://blog.csdn.net/chenchunlin526/article/details/6993933)