概念POJO、DTO、DAO、PO、BO、VO、ENTITY詳解

曉風殘月淡發表於2020-10-11

在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目錄中。

相關文章