概念POJO、DTO、DAO、PO、BO、VO、ENTITY詳解
在java開發過程中,新手總是被DAO、PO、BO、VO等等概念弄得暈頭轉向。
下面我查詢了很多資料,總結如下:
POJO(Plain Ordinary Java Object 簡單Java物件)
實際就是普通JavaBeans,是為了避免和EJB混淆所創造的簡稱。
POJO的內在含義是指:那些沒有繼承任何類、也沒有實現任何介面,更沒有被其它框架侵入的java物件。它包括PO、DTO、VO、BO等。
POJO持久化-》PO
POJO傳遞-》 DTO
POJO在表示層-》VO
PO(persistence object 持久層物件)
通常是ORM(物件關係對映)中與資料表的一條記錄相匹配,自身屬性與資料表欄位一一對應。好處是可以把一條記錄作為一個物件處理,方便的轉為其它物件。
- 只包含getter、setter和toString方法。
- 不包含業務邏輯與資料庫的訪問方法。
- PO需要實現序列化,以備轉換成DTO作為前端輸出及遠端呼叫使用。
//示例程式碼
public class User implements Serializable {
//序列化版本
private static final long serialiVersionUID = 1L;
private Long id;
private String username;
private String password;
//省略getter和setter方法
}
DAO(data access object 資料訪問物件)
包含對資料的訪問,負責持久層的操作 。通常需要結合PO來訪問資料庫,主要用來封裝對資料的訪問。它包含業務邏輯,不與其它物件進行轉化。
public interface Dao{
int insert(User user);
User selectById(long id);
}
DTO(Data Transfer Object 資料傳輸物件)
資料傳輸物件,是在應用網路層需要傳輸的物件。
比如,從輸入來看,應用在介面接收傳入物件,然後又轉換成實體進行持久化。在此過程中,傳輸的物件就是DTO。
從輸出來看,若資料表有100個欄位,那麼PO中就有100個屬性,而介面可能只需要其中10個屬性,那麼查詢資料庫後,物件就需要由PO轉化成DTO。DTO可能還需要給前端傳輸一些不在資料庫中查到的屬性,所以需要新增屬性。
DTO只包含自身資料的儲存,而不包含業務邏輯。DTO能避免過多無用資料傳輸,能隱藏後端的表結構。
//示例程式碼,繼承實體類,從查詢到的PO中新增屬性返回給前端
public class UserDTO extends User {
//序列化版本
private static final long serialiVersionUID = 2L;
//使用者標識
private String username;
public String getUsername(){return username;}
public void setUsername(String username){this.username= username;}
//新增額外屬性
private HashMap<String, Object> extProperties;
public HashMap<String, Object> getExtProperties() {
return extProperties;
}
public void setExtProperties(HashMap<String, Object> extProperties) {
this.extProperties = extProperties;
}
}
Entity(實體)
實體,顧名思義,實體需要給予一個唯一標識,以區分其它實體,而值物件VO不需要。
實體應該有一個生命週期,例如抽象訂單有一個唯一識別號,訂單有從下單建立到最後交貨完成的生命週期。實體物件需要維護生命週期中狀態的一致性。
例如,PO有唯一標識,與資料表的一條記錄對應,所以是一個實體類。
特別注意:Entity不僅僅只有PO一種,業務物件(BO)也可能被抽象為實體。
//示例程式碼
public class Entity{
private int id;
int getId(){return id;}
}
VO(value object 值物件)
值物件,通常用於業務層之間的資料傳遞,僅僅包含自身的資料。
與實體的區別是,沒有唯一標識。
與PO的區別是,PO只在資料層,VO在商業邏輯層和表示層。
值物件不需要維護生命週期中狀態的一致性,這個物件被建立後只能被引用,當沒有引用時交給垃圾回收自動處理。
值物件應該與實體一起區分:
- 核心實體和值物件應該在領域(Domain)層
- 定義的領域服務(Domain Service)在Service層
- 值物件和實體的儲存邏輯都應該在Repository層
//示例程式碼
public class ValueObject{
}
理解了VO的意思,也就明白了,DTO也是一種值物件。
VO( View Object):另一層含義是顯示層物件,通常是Web向模板渲染引擎層傳輸的物件。
BO(business object 業務物件)
業務物件,就是把業務邏輯封裝為一個物件(注意是邏輯,業務邏輯),這個物件可以包括一個或多個其它的物件。通過呼叫Dao方法,結合PO或VO進行業務操作。
業務物件可被抽象為“實體(Entity)”或“值物件(VO)”。
比如一個簡歷,有教育經歷、工作經歷、社會關係等等。
我們可以把教育經歷對應一個PO,工作經歷對應一個PO,社會關係對應一個PO。
建立一個對應簡歷的BO物件處理簡歷,每個BO包含這些PO。
這樣處理業務邏輯時,我們就可以針對BO去處理。
- PO通常放在名為bean、entity、model目錄中。
- DAO通常在DAO、mapper目錄中。
- BO通常在service、manager、business目錄中。
相關文章
- Java中PO、DO、TO、DTO、 VO、 BO、POJO 、DAO的概念JavaPOJO
- vo bo dto pojo(entity)POJO
- java的幾種物件(PO,VO,DAO,BO,POJO,DTO)解釋Java物件POJO
- Java開發中的幾種物件的說明(PO,VO,DTO,BO,POJO,DAO,SAO等)Java物件POJO
- POJO、PO、DO、VO、DTO等淺析POJO
- 專案中DO、PO、BO,DTO、VO的概念與意義
- DO、DTO、BO、AO、VO、POJO定義規範POJO
- 後端開發基礎概念 Entity,DAO,DO,DTO,VO, Service,Controller後端Controller
- PO、VO、DTO、DO等淺析
- 淺析VO、DTO、DO、PO的概念、區別和用處
- Java | DO / DTO / BO / VO的區別Java
- 一款 IDEA 外掛幫你優雅轉化 DTO、VO、BO、PO、DOIdea
- VO/DTO/DO/PO通俗的解釋加上自己的理解
- 使用IDEA+groovy快速生成entity、dto、dao、service、serviceImplIdea
- DTO轉VO工具
- javabean:VO和POJO的區別?JavaBeanPOJO
- 何時使用Entity或DTO
- 轉載:領域模型中的實體類分為四種型別:VO、DTO、DO、PO模型型別
- 關於對於Java中Entity以及VO,以及DTO中Request物件序列化的學習Java物件
- VO(檢視模型) 與 DTO(資料傳輸物件)的區別模型物件
- RabbitMQ概念詳解MQ
- 整個小東西,在IDEA中自動生成PO、DAO、MapperIdeaAPP
- Git物件概念詳解Git物件
- Docker基本概念詳解Docker
- 解放雙手,自動生成“x.set(y.get)”,搞定vo2dto轉換
- 1-Hyperledger Fabric概念詳解
- 我寫了個IDEA開源外掛,vo2dto 一鍵生成物件轉換Idea物件
- ZooKeeper 系列(一)—— ZooKeeper核心概念詳解
- MyBatis-plus第三章:自動生成entity、dao、service、controller四層程式碼MyBatisController
- iOS多執行緒詳解:概念篇iOS執行緒
- 鐳速——FTP伺服器概念詳解FTP伺服器
- Python中集合的概念及基本操作詳解!Python
- 12種 vo2dto 方法,就 BeanUtils.copyProperties 壓測最拉胯!【快雙11了,別用錯嘍】Bean
- [譯] Flutter 核心概念詳解: Widget、State、Context 及 InheritedWidgetFlutterContext
- .NET程式執行原理及基本概念詳解
- C++指標的概念解讀 超詳細C++指標
- LomBok簡化POJOLombokPOJO
- SAP SEGW 裡的 Entity Type 作用講解