侧边栏壁纸

深入理解后端开发中的VO、PO、DTO、BO

2024年10月09日 163阅读 0评论 1点赞

在后端开发中,我们经常会接触到VOPODTOBO等概念。对于初学者来说,这些名词可能有些陌生,甚至有些混淆。本篇文章将详细介绍这些概念,并以Spring Cloud用户登录为例,帮助大家更好地理解它们的应用场景。

一、VO、PO、DTO、BO是什么?

1. VO(Value Object)——值对象

VO值对象的简称,主要用于在展示层(View)与业务层之间传递数据。它通常用于封装从前端接收的数据或者需要返回给前端展示的数据。

特点:

  • 仅包含数据,没有业务逻辑
  • 用于表示一个数值的对象,通常是只读的。
  • 生命周期短暂,一般只在一次请求或响应中存在。

示例:

当用户在登录页面输入用户名和密码时,这些数据可以封装为一个UserLoginVO对象,传递给后端处理。

2. PO(Persistent Object)——持久化对象

PO持久化对象,与数据库中的表结构一一对应,通过ORM框架(如MyBatis、Hibernate)将数据库中的数据映射为Java对象。

特点:

  • 与数据库表结构直接对应
  • 用于持久化数据的存储和读取
  • 可能包含数据库中的所有字段,包括一些不常用的字段。

示例:

用户信息在数据库中存储为user表,后端使用UserPO对象来映射这张表的数据。

3. DTO(Data Transfer Object)——数据传输对象

DTO数据传输对象,用于在不同的层或远程调用之间传输数据。它可以对传输的数据进行裁剪,只保留必要的信息,减少数据传输量。

特点:

  • 用于远程调用或长时间保存的数据传输
  • 可以对数据进行裁剪,避免传输不必要的数据
  • 通常只包含数据,不包含业务逻辑

示例:

在微服务架构中,用户服务需要将用户信息传递给订单服务,可以使用UserDTO来传输必要的用户信息。

4. BO(Business Object)——业务对象

BO业务对象,封装了业务逻辑的Java对象。它通过对多个PO、VO或其他BO进行组合,完成具体的业务操作。

特点:

  • 包含业务逻辑或业务方法
  • 可以由多个PO或其他对象组合而成
  • 用于业务层的处理,贯穿整个业务流程

示例:

在用户登录过程中,UserLoginBO封装了验证用户身份、记录登录日志等业务逻辑。

二、以Spring Cloud用户登录为例

下面,我们以Spring Cloud框架下的用户登录功能为例,来具体说明VO、PO、DTO、BO的应用。

1. 用户登录流程

  1. 用户在前端输入用户名和密码,点击登录。
  2. 前端将用户名和密码封装为UserLoginVO对象,发送给后端。
  3. 后端Controller接收到UserLoginVO,将其转换为UserDTO,传递给服务层。
  4. 服务层调用UserLoginBO,处理登录逻辑。
  5. UserLoginBO使用DAO层查询数据库,获取UserPO对象。
  6. 验证通过后,生成UserInfoVO,返回给前端展示。

2. 代码示例

(1)UserLoginVO —— 接收前端数据

public class UserLoginVO {
    private String username;
    private String password;

    // Getter and Setter
}

说明:

  • 用于接收前端传递的用户名和密码。
  • 只包含数据,不包含任何业务逻辑。

(2)UserDTO —— 服务间数据传输

public class UserDTO {
    private String username;
    private String encryptedPassword;

    // Getter and Setter
}

说明:

  • 用于在服务层之间传输数据,比如在微服务之间的调用。
  • 可以对数据进行必要的处理,如密码加密。

(3)UserPO —— 数据库持久化对象

public class UserPO {
    private Long id;
    private String username;
    private String encryptedPassword;
    private Date createTime;
    private Date updateTime;

    // Getter and Setter
}

说明:

  • 与数据库中的user表结构对应。
  • 包含数据库中的所有字段,用于数据的持久化存储。

(4)UserLoginBO —— 业务逻辑处理

@Service
public class UserLoginBO {

    @Autowired
    private UserDAO userDAO;

    public UserDTO login(UserDTO userDTO) {
        // 1. 根据用户名查询用户信息
        UserPO userPO = userDAO.findByUsername(userDTO.getUsername());
        // 2. 验证密码是否正确
        if (userPO != null && userPO.getEncryptedPassword().equals(userDTO.getEncryptedPassword())) {
            // 3. 登录成功,返回用户信息
            userDTO.setId(userPO.getId());
            return userDTO;
        } else {
            // 4. 登录失败,抛出异常或返回null
            return null;
        }
    }
}

说明:

  • 封装了用户登录的业务逻辑。
  • 处理用户验证、异常处理等业务操作。

(5)UserInfoVO —— 返回前端的数据

public class UserInfoVO {
    private Long id;
    private String username;
    private String token;

    // Getter and Setter
}

说明:

  • 登录成功后,返回给前端的用户信息。
  • 包含必要的数据,敏感信息不会返回。

3. 流程总结

  • Controller层:接收UserLoginVO,调用服务层。
  • 服务层:将UserLoginVO转换为UserDTO,调用业务逻辑层UserLoginBO
  • 业务逻辑层UserLoginBO处理登录逻辑,使用UserPO与数据库交互。
  • 返回结果:登录成功后,将结果封装为UserInfoVO,返回给前端。

三、总结

通过上述示例,我们可以清晰地看到VO、PO、DTO、BO在后端开发中的角色和作用:

  • VO(Value Object):用于界面层与服务层之间的数据传递,表示一次请求或响应的数据。
  • PO(Persistent Object):用于持久化数据,与数据库表结构对应,进行数据的存储和读取。
  • DTO(Data Transfer Object):用于服务层之间的数据传输,可能需要序列化,传输的数据可能经过裁剪和处理。
  • BO(Business Object):封装业务逻辑,处理具体的业务操作,是业务层的核心。

理解并合理运用这些对象,可以使我们的代码结构更加清晰,职责更加明确,提升代码的可维护性和可读性。
还可参考这篇文章来进行理解: 一文讲清DTO、BO、PO、VO,为什么可以不需要VO?

1
打赏

—— 评论区 ——

昵称
邮箱
网址
取消
人生倒计时
舔狗日记