在 Java 分層開發(fā)中,PO、BO、DTO、VO 和 POJO 是常見的對象類型,它們在不同層次中扮演不同的角色,幫助開發(fā)者更好地組織代碼結(jié)構(gòu),提高可維護性和可讀性。
1. PO(Persistent Object,持久化對象)**
- **定義**:PO 是與數(shù)據(jù)庫表結(jié)構(gòu)一一對應的對象,每個字段映射表中的一列。
- **作用**:用于數(shù)據(jù)持久化操作,如增刪改查(CRUD),通常由 ORM 框架(如 MyBatis、Hibernate)自動生成。
- **示例**:
```java
@Table(name = "t_user")
public class UserPO {
@Id
private Long userId;
private String userName;
// 其他字段...
}
```
2. BO(Business Object,業(yè)務對象)**
- **定義**:BO 封裝業(yè)務邏輯,可由多個 PO 組合而成,包含復雜的業(yè)務操作(如數(shù)據(jù)校驗、流程控制)。
- **特點**:獨立于具體存儲方式,可操作數(shù)據(jù)庫、緩存、外部接口等。
- **示例**:
```java
public class OrderBO {
private OrderPO order;
private List<ItemPO> items;
private UserPO user;
public BigDecimal calculateTotal() {
// 復雜的計算邏輯...
}
}
```
3. DTO(Data Transfer Object,數(shù)據(jù)傳輸對象)**
- **定義**:DTO 用于不同層之間的數(shù)據(jù)傳輸,尤其是 Service 層與 Controller 層的交互。
- **特點**:
- 可能包含多個 PO 的組合或裁剪后的字段(例如從 30 個字段中選取 10 個傳輸)。
- 支持序列化,常用于遠程調(diào)用(如 RPC、HTTP 接口)。
- **無業(yè)務邏輯**。
- **示例**:
```java
public class UserDTO {
private String displayName;
private LocalDateTime registerTime;
public static UserDTO fromPO(UserPO po) {
// 轉(zhuǎn)換邏輯...
}
}
```
4. VO(View Object,視圖對象)**
- **定義**:VO 是展示層(前端頁面)直接使用的對象,僅包含前端需要展示的數(shù)據(jù),通常以 JSON 形式返回。
- **應用場景**:Controller 層將數(shù)據(jù)封裝為 VO 后傳遞給前端,避免暴露敏感字段(如密碼、內(nèi)部狀態(tài))。
- **示例**:
```java
public class UserVO {
private String formattedDate;
private String userLevel;
// 可能包含組合字段...
}
```
5. POJO(Plain Ordinary Java Object,簡單 Java 對象)**
- **定義**:POJO 是所有簡單 Java 對象的統(tǒng)稱,VO、DTO、PO 等均屬于 POJO。
- **特點**:僅包含屬性及 Getter/Setter 方法,不依賴特定框架。
6. 對比與區(qū)別**
| 對象 | 應用場景 | 特點 |
|------|---------|------|
| **PO** | 數(shù)據(jù)庫交互 | 與數(shù)據(jù)庫表嚴格對應 |
| **BO** | Service 層內(nèi)部業(yè)務邏輯 | 封裝復雜業(yè)務邏輯,可包含多個 PO 的組合 |
| **DTO** | Service 層與 Controller 層間 | 聚合業(yè)務所需數(shù)據(jù),可能組合多個 PO |
| **VO** | Controller 層與前端交互 | 按前端需求定制字段 |
7. 關(guān)鍵區(qū)別**
- **PO vs DTO**:PO 嚴格映射數(shù)據(jù)庫表,DTO 可根據(jù)業(yè)務需求裁剪字段。
- **DTO vs VO**:DTO 關(guān)注傳輸效率,VO 關(guān)注展示效果。例如,DTO 可能包含敏感字段(如用戶 ID),而 VO 僅展示脫敏后的信息。
- **BO vs PO**:BO 包含業(yè)務邏輯,PO 僅存儲數(shù)據(jù)。例如,訂單 BO 可能計算總價,而訂單 PO 僅記錄金額。