在 Spring Boot 开发中,VO、DTO 是常见的概念,代表不同的对象层次和职责。此外还有其他常见的对象类型,例如 BO、PO、DO 等

513 阅读3分钟

在 Spring Boot 开发中,VO、DTO 是常见的概念,代表不同的对象层次和职责。此外还有其他常见的对象类型,例如 BO、PO、DO 等。以下是它们的含义及用途:

1. VO (Value Object) - 值对象

定义:

VO 通常是视图对象,用于在前端和后端之间交互的数据模型,通常是响应数据的载体。

特点:

一般只包含属性和 getter/setter 方法,没有业务逻辑。 不直接与数据库交互。 常与前端展示的页面结构保持一致。

场景:

后端将处理后的数据封装成 VO,返回给前端

例子


public class UserVO {
    private Long id;
    private String name;
    private String email;
    
    // getter and setter
}

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

定义:

DTO 用于在不同层之间传输数据,例如控制层、服务层、数据访问层等。它可能是从前端接收到的请求对象,也可能是后端传递的数据载体。

特点

类似 VO,但更侧重于服务内部传输。 可能包含简单的数据验证逻辑。 数据模型与数据库表不直接映射。

场景

用于从控制器接收请求参数,或者在服务之间传递数据。

例子

public class UserDTO {
    private String name;
    private String password;
    private String email;

    // getter and setter
}

3. PO (Persistent Object) - 持久化对象

定义:

PO 是直接与数据库表对应的对象,通常使用 JPA、MyBatis 等框架来映射。

特点:

每个 PO 对象通常对应数据库中的一张表。 包含数据库字段的映射和基本的 CRUD 操作。

场景:

用于数据持久化操作(例如读写数据库)。


@Entity
public class UserPO {
    @Id
    private Long id;
    private String name;
    private String email;
    private String password;

    // getter and setter
}

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

定义:

DO 是领域模型中的对象,表示业务逻辑中的实体。

特点:

注重业务语义,通常在领域驱动设计(DDD)中使用。 可能包含业务逻辑和行为。

场景:

用于表示系统的核心业务概念。

public class UserDO {
    private Long id;
    private String name;
    private String email;

    // 包含业务逻辑方法
    public boolean isEmailValid() {
        return this.email != null && this.email.contains("@");
    }
}

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

定义:

BO 是服务层或业务逻辑中使用的对象,负责处理业务逻辑和应用逻辑。

特点:

聚合和封装多个领域对象或数据模型。 用于业务逻辑的处理层。

场景:

用于在服务层之间传递数据,或者将领域对象组合成业务逻辑模型。

例子


public class UserBO {
    private Long userId;
    private String userName;
    private List<Order> orders;

    // 可能包含复杂的业务逻辑
    public int getTotalOrderCount() {
        return orders.size();
    }
}

6. Entity - 实体

定义:

在 JPA 中,Entity 通常是数据库表的映射对象(类似于 PO)。和 PO 类似,但更专注于 ORM 框架的使用。

特点:

通常用注解(如 @Entity、@Table)标记。 包含数据库表字段和元数据。

场景:

作为数据库映射对象。

例子



@Entity
@Table(name = "users")
public class UserEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private String email;
    
    // getter and setter
}

7. 总结对比

image.png

实际开发中的转换流程

一般来说,以下流程较为常见:

1前端发送请求(DTO) → 后端控制器处理。

2后端控制器调用服务 → 服务层创建或使用 DO/BO 处理业务逻辑。

3业务逻辑处理完成 → 封装 VO 返回给前端。

4 PO/Entity 用于数据库交互。

这套体系帮助开发者清晰分层,增强代码的可维护性和可扩展性。