PO、DTO、VO等9大对象划分详解,让你的代码不再“一团糟”

PO、DTO、VO等9大对象划分详解,让你的代码不再“一团糟”_第1张图片

目录

    • 一、 PO (Persistent Object)
    • 二、 DO (Domain Object)
    • 三、 TO (Transfer Object)
    • 四、 DTO (Data Transfer Object)
    • 五、 VO (View Object)
    • 六、 BO (Business Object)
    • 七、 POJO (Plain Ordinary Java Object)
    • 八、 DAO (Data Access Object)
    • 九、 Entity
    • 对象转换与使用场景总结
    • 何时使用何种对象?
    • 最佳实践

我的其他文章也讲解的比较有趣,如果喜欢博主的讲解方式,可以多多支持一下,感谢!
了解SpringBoot常用注解请看: SpringBoot常用注解,一文搞懂!

其他优质专栏: 【SpringBoot】【多线程】【Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

在Java项目中,对象的划分有助于解耦各层职责,提升代码的可维护性和扩展性。以下是各类对象的详细说明及其应用场景:


一、 PO (Persistent Object)

  • 定义持久化对象,直接映射数据库表结构,每个属性对应表的字段。
  • 用途
    • 用于DAO层与数据库交互,通过ORM框架(如MyBatis、Hibernate)操作。
    • 通常与数据库表一一对应,仅包含数据字段和基本getter/setter方法。
  • 示例
    public class UserPO {
        private Long id;
        private String username;
        private String password;
        // getters/setters...
    }
    
  • 使用场景
    • 数据库读写时,如通过MyBatis的Mapper操作表数据。

二、 DO (Domain Object)

  • 定义领域对象,代表业务领域中的核心模型,包含业务逻辑。
  • 用途
    • 在领域驱动设计(DDD)中,承载业务规则和状态。
    • 可能聚合多个PO或调用其他领域服务。
  • 特点
    • 包含业务方法(如订单总价计算)。
    • 与数据库结构可能不完全一致。
  • 示例
    public class OrderDO {
        private OrderPO order;
        private List<OrderItemPO> items;
        
        public BigDecimal calculateTotalPrice() {
            return items.stream()
                .map(item -> item.getPrice().multiply(item.getQuantity()))
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        }
    }
    
  • 使用场景
    • 复杂业务逻辑处理,如订单创建、状态流转。

三、 TO (Transfer Object)

  • 定义传输对象,广义上与DTO类似,但可能更轻量。
  • 用途
    • 在系统内部或模块间传输数据,减少远程调用次数。
  • 特点
    • 通常不包含业务逻辑,仅作为数据容器。
  • 示例
    public class UserTO {
        private String username;
        private String email;
        // getters/setters...
    }
    
  • 使用场景
    • 模块间数据传输,如服务间API调用。

四、 DTO (Data Transfer Object)

  • 定义数据传输对象,用于跨层或跨服务传输数据。
  • 用途
    • Controller接收前端请求参数(如REST接口的@RequestBody)。
    • 微服务间通信,避免暴露内部数据结构。
  • 特点
    • 可聚合多个PO的字段,或裁剪敏感信息(如脱敏密码)。
  • 示例
    public class UserDTO {
        private String username;
        private String email;
        // getters/setters...
    }
    
  • 使用场景
    • 前端提交表单数据,或服务间通过Feign传递数据。

五、 VO (View Object)

  • 定义视图对象,面向前端展示的定制化数据模型。
  • 用途
    • 返回给前端的JSON数据,适配页面需求。
    • 格式化数据(如日期、金额)、聚合多表数据。
  • 示例
    public class UserVO {
        private String username;
        private String avatarUrl;
        private String createTime; // 格式化为"yyyy-MM-dd HH:mm:ss"
        // getters/setters...
    }
    
  • 使用场景
    • Controller层返回给前端的响应数据。

六、 BO (Business Object)

  • 定义业务对象,封装复杂业务逻辑,可能聚合多个PO或服务。
  • 用途
    • 在Service层处理跨实体的业务逻辑。
    • 协调多个DAO或领域对象的操作。
  • 示例
    public class OrderBO {
        private OrderPO order;
        private UserPO user;
        
        public void validateStock() {
            // 调用库存服务校验商品库存
        }
    }
    
  • 使用场景
    • 订单创建时校验库存、用户权限等跨实体逻辑。

七、 POJO (Plain Ordinary Java Object)

  • 定义简单Java对象,不依赖框架特定类或接口。
  • 特点
    • 仅包含属性、getter/setter和基本方法。
    • PO、DTO、VO等均可视为POJO。
  • 示例
    public class UserPOJO {
        private String name;
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
    }
    
  • 使用场景
    • 所有需要轻量级数据容器的场景。

八、 DAO (Data Access Object)

  • 定义数据访问对象,抽象数据库操作的接口。
  • 用途
    • 隔离业务层与数据库,提供CRUD方法。
    • 通常与PO配合使用。
  • 示例
    public interface UserDAO {
        UserPO findById(Long id);
        void save(UserPO user);
    }
    
  • 使用场景
    • 数据库操作封装,如通过MyBatis Mapper访问表。

九、 Entity

  • 定义:在JPA(如Hibernate)中,标注@Entity的类,直接映射数据库表。
  • 特点
    • 包含JPA注解(如@Id, @OneToMany),定义表结构和关联关系。
  • 示例
    @Entity
    @Table(name = "user")
    public class UserEntity {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String username;
        @OneToMany(mappedBy = "user")
        private List<OrderEntity> orders;
    }
    
  • 使用场景
    • 使用JPA/Hibernate时替代PO,处理ORM关系映射。

对象转换与使用场景总结

对象 层级/场景 核心作用
PO DAO层 直接操作数据库,与表结构严格对应。
DO 领域层(DDD) 封装业务规则,处理复杂领域逻辑。
DTO/TO Controller/Service层、服务间通信 跨层或跨服务传输数据,屏蔽底层细节。
VO Controller层 适配前端展示,格式化数据。
BO Service层 协调多个PO或服务,处理复杂业务逻辑。
DAO DAO层 抽象数据库操作,隔离业务与数据访问。
Entity DAO/Repository层(JPA) 通过ORM框架映射数据库表及关联关系。
POJO 通用 泛指所有简单Java对象,强调无框架依赖。

何时使用何种对象?

  1. 数据库操作PO/Entity
    (MyBatis用PO,Hibernate/JPA用Entity)。
  2. 接收前端请求参数DTO
    (如REST接口的@RequestBody)。
  3. 返回前端数据VO
    (如格式化日期、脱敏手机号)。
  4. 复杂业务逻辑BO/DO
    (如订单创建需要校验库存、用户权限)。
  5. 微服务通信DTO
    (传递必要字段,避免暴露敏感信息)。
  6. 数据库访问抽象DAO
    (定义findByIdsave等方法)。

最佳实践

  • 避免对象混用:如PO直接传递给前端会导致暴露表结构。
  • 使用转换工具
    • MapStruct:通过注解自动生成PO→DTO→VO转换代码。
    • Spring BeanUtils:简单属性拷贝(浅拷贝)。
  • 按需设计:小型项目可合并DTO/VO,避免过度设计。

通过合理划分对象职责,代码结构更清晰,维护性和扩展性显著提升。

你可能感兴趣的:(SpringBoot,Java,Java,SpringBoot)