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