Spring项目中DTO、DO、BO、VO、PO分别代表什么

在Spring项目开发中,我们经常会遇到各种对象缩写,如DTO、DO、BO、VO、PO等。以下我将介绍这些对象在不同的业务场景和架构层次是什么作用,分别是什么意思

📋 对象概览

缩写 全称 主要用途
DTO Data Transfer Object 数据传输对象
DO Domain Object 领域对象
BO Business Object 业务对象
VO View Object 视图对象
PO Persistence Object 持久化对象

🔍 详细解析

1. DTO (Data Transfer Object) - 数据传输对象

DTO 主要用于不同层或不同系统之间的数据传输,特别是在分布式系统和微服务架构中。

java

1
2
3
4
5
6
7
8
9
10
// 示例:用户DTO
public class UserDTO {
private Long id;
private String username;
private String email;
private Date createTime;

// getter/setter 方法
// 通常不包含业务逻辑
}

特点:

  • 扁平化结构,便于序列化
  • 通常不包含业务逻辑
  • 用于Controller与Service层之间的数据传输
  • 在微服务中用于服务间API调用

2. DO (Domain Object) - 领域对象

DO 是领域驱动设计(DDD)中的核心概念,代表业务领域中的实体和概念。

java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 示例:用户领域对象
public class UserDO {
private UserId id;
private Username username;
private Password password;
private Email email;
private UserStatus status;

// 包含领域行为
public void changePassword(String newPassword) {
// 密码变更的业务规则
this.password = new Password(newPassword);
}

public boolean isActive() {
return this.status == UserStatus.ACTIVE;
}
}

特点:

  • 包含数据和业务行为
  • 体现业务规则和约束
  • 是业务逻辑的核心载体
  • 通常与数据库表结构解耦

3. BO (Business Object) - 业务对象

BO 封装了复杂的业务逻辑,通常由多个DO或PO组合而成。

java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 示例:订单业务对象
public class OrderBO {
private OrderDO order;
private List<OrderItemDO> items;
private UserDO user;

// 复杂的业务逻辑
public BigDecimal calculateTotalAmount() {
BigDecimal total = BigDecimal.ZERO;
for (OrderItemDO item : items) {
total = total.add(item.getPrice().multiply(new BigDecimal(item.getQuantity())));
}
// 应用折扣、税费等业务规则
return applyBusinessRules(total);
}

public void validateOrder() {
// 复杂的业务验证逻辑
if (items.isEmpty()) {
throw new BusinessException("订单必须包含商品");
}
// 更多业务规则验证...
}
}

特点:

  • 封装复杂的业务逻辑
  • 可能组合多个领域对象
  • 处理跨实体的业务规则
  • 通常用在Service层

4. VO (View Object) - 视图对象

VO 专门为前端展示而设计,包含界面需要的所有数据。

java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 示例:用户视图对象
public class UserVO {
private String displayName;
private String avatarUrl;
private String roleName;
private String department;
private String lastLoginTime;

// 可能包含格式化方法
public String getFormattedCreateTime() {
// 日期格式化逻辑
return DateUtils.format(createTime, "yyyy-MM-dd HH:mm");
}
}

特点:

  • 为前端展示量身定制
  • 可能包含多个DO/DTO的组合数据
  • 包含格式化的展示数据
  • 在Controller层返回给前端

5. PO (Persistence Object) - 持久化对象

PO 与数据库表结构直接对应,用于ORM框架操作。

java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 示例:用户持久化对象
@Entity
@Table(name = "t_user")
public class UserPO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name = "user_name", length = 50)
private String username;

@Column(name = "password_hash")
private String passwordHash;

@Column(name = "email")
private String email;

@Column(name = "create_time")
private Timestamp createTime;

// 主要是getter/setter,通常不包含业务逻辑
}

特点:

  • 与数据库表一一对应
  • 包含JPA/Hibernate/MyBatis等ORM注解
  • 主要用于数据持久化操作
  • 在DAO/Repository层使用