项目分层开发中,DTO、BO、PO、VO的含义

在后端开发中,比如传统的MVC架构和现在流行的DDD架构,经常回使用到几种对象的概念

  • DTO (Data Transfer Object) 数据传输对象: DTO设计模式用于将数据从服务端传输到客户端,或者在不同的服务之间传递。通常,DTO包含了特定业务场景需要的数据结构,并且不包含任何业务逻辑。它简化了不同服务或模块之间的交互,使得各个层之间的耦合度降低。

  • BO (Business Object) 业务对象: BO代表了业务逻辑层中的对象,封装了与某个业务相关的数据以及针对这些数据的操作逻辑。一个BO可能由多个实体属性组成,并处理涉及多个实体的复杂业务逻辑。

  • PO (Persistent Object) 持久化对象: PO主要用来表示数据库表的一条记录,它的属性和数据库表的字段相对应。通常在持久层(如Hibernate、JPA等ORM框架)中使用,主要用于操作数据库,如保存、更新和查询数据。

  • VO (Value Object) 值对象: VO是视图层的对象,通常用于封装展示给用户的数据,它可以和数据库表对应,也可以根据UI界面需求进行定制。VO的主要目的是在页面展示时只携带必要的数据,从而避免把大量不必要的数据暴露给前端。

这个是PO类

复制代码
@Data
public class User implements Serializable{
    private Long id;

    private String username;

    private String password;

    private String identityCard;

    private String gender;

    private String location;

    private String userImage;

    private String phoneNumber;

    private String createTime;

    private String updateTime;

    @TableLogic
    private int isDelete;
}

UserDTO类

复制代码
@Data
public class UserDTO implements Serializable{
    private Long id;

    private String username;

    private String password;

    private String identityCard;

    private String gender;

    private String location;

    private String userImage;

    private String phoneNumber;
}

UserLoginBO、UserUpdateBO

复制代码
@Data
public class UserLoginBO implements Serializable{
    private String username;

    private String password;
}

@Data
public class UserUpdateBO implements Serializable{
    private Long id;

    private String username;

    private String password;

    private String identityCard;

    private String gender;

    private String location;

    private String userImage;

    private String phoneNumber;
}

UserDTO是一个大的入口,它可以接收整个模块的参数

BO则是在进入Service层之前对UserDTO的数据进行过滤,并且对边界进行控制

最后在进入infra层之前转为PO

其实BO也可以像UserDTO那样,直接一个UserBO包含UserLoginBOUserUpdateBO,单纯的做模型转换,不做值过滤也可以

在后端开发中是这么使用的

相关推荐
寻星探路3 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧6 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7257 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎7 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄7 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿7 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds7 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹7 小时前
【Java基础】多态 | 打卡day2
java·开发语言