首先来看看他们的全称分别都叫什么吧

  • PO:Persistent Object,持久化对象
  • VO:Value Object,值对象
  • BO:Business Object,业务对象
  • DTO:Data Transfer Object,数据传输对象

PO(Persistent Object,持久化对象):

定义:PO是与数据库中的表结构一一对应的对象。通常,一个PO类对应数据库中的一张表,PO的属性对应表中的字段。
作用:主要用于在Java应用与数据库之间进行数据持久化操作,如通过ORM(对象关系映射)框架(如Hibernate、MyBatis)将PO对象直接映射到数据库记录上,实现数据的CRUD(创建、读取、更新、删除)操作。
特点:PO中通常包含了一些与数据库操作相关的注解或配置,如主键标识、字段映射等。

VO(Value Object,值对象):

定义:VO通常用于封装业务层返回给表示层(如前端)的数据。VO可以包含多个属性,用于表示一个具体的业务场景中的数据组合。
作用:主要用于数据封装和传输,特别是从业务层向表示层传输数据时。VO的设计通常根据前端的需求来定制,只包含前端需要展示或处理的数据。
特点:VO通常是轻量级的,不包含任何业务逻辑或持久化逻辑,只是一个纯粹的数据容器。

BO(Business Object,业务对象):

定义:BO是封装了业务逻辑的对象,通常包含了业务方法或操作。
作用:主要用于处理业务逻辑,是业务层的核心组件。BO通过调用DAO(Data Access Object,数据访问对象)或访问服务层来执行具体的业务操作,并将结果封装成VO或DTO返回给调用者。
特点:BO中包含了业务逻辑的实现,如用户注册、订单处理等。BO可能会直接操作PO,但通常不会直接暴露给表示层,而是通过DTO或VO进行数据传输。

DTO(Data Transfer Object,数据传输对象):

定义:DTO是一种用于在不同层(如业务层与表示层)之间传输数据的对象。DTO的设计通常基于服务契约,确保数据传输的一致性和安全性。
作用:主要用于在不同系统组件或服务之间传输数据,特别是在需要跨层或跨系统通信时。DTO可以看作是一个数据容器,用于在组件或服务之间传递数据。
特点:DTO通常只包含属性,不包含任何业务逻辑或持久化逻辑。DTO的设计通常遵循一定的规范和约定,以确保数据的正确性和安全性。

以上来自于AI生成,是不是有种好像懂了又好像没懂的感觉?(反正我是T^T)
让我用人类听得懂的语言解释一下吧(但是不包对的哦)

  • PO:数据库中的实体或表的映射,不可修改,直接从数据库查出来的对象
  • VO:在不同层之间传递数据,如前端和后端之间,接收前端参数,返回给查询前端结果
  • BO:用于封装业务逻辑和操作(这个似乎很少用到,目前我还没怎么见过)
  • DTO:在后端的不同层之间传递数据,例如controller层和service层或者在服务之间结构调用的时候使用DTO
    现在我们以一个订单的新增操作来了解一下他们的实际应用
    PO创建两个类Order和OrderItem ,对应数据库的表不可修改
    VO创建实体类来接收前端的参数
    DTO不同数据格式但是行为一致的,提供统一的方法入口.假设现在需要同步第三方的订单过来,第三方订单和原来的add接口的数据结构不一致,并且多出支付信息OrderPay orderPay
1
2
3
4
5
6
7
8
9
@Data
public class Order{
// 订单id
private Long id;
// 订单号
private String uniqueOrderNo;
// 购买人手机
private String phone;
}
1
2
3
4
5
6
7
8
9
10
11
@Data
public class OrderItem {
// 订单明细id
private Long id;
// 订单id
private Long orderId;
// 商品id
private Long productId;
// 购买数量
private Integer quantity;
}
1
2
3
4
5
6
7
8
9
@Data
public class OrderAddVo {
// 订单号
private String uniqueOrderNo;
// 购买人手机
private String phone;
// 订单明细
private List<OrderItemAddVo> items;
}
1
2
3
4
5
6
7
@Data
public class OrderItemAddVo {
// 商品id
private Long productId;
// 购买数量
private Integer quantity;
}
1
2
3
4
5
6
7
@PostMapping(value =  "/add")
public ResponseEnvelope<Long>(@RequestBody OrderAddVo addVo){
// 保存到数据库
Long orderId = save(addVo);
return new ResponseEnvelope<>(orderId);
}

1
2
3
4
5
6
@Data
public class ThirdPartyOrder {
private Order order;
private List<OrderItem> items;
private OrderPay orderPay;
}
1
2
3
4
5
6
private static class Order{
// 订单号
private String uniqueOrderNo;
// 购买人手机
private String phone;
}
1
2
3
4
5
6
private static class OrderItem{
// 商品id
private String productId;
// 数量
private Integer quantity;
}
1
2
3
4
5
6
private static class OrderPay{
// 支付类型
private String payType;
// 支付流水号
private String panNo;
}

好了,好像有一点点更懂了但是没完全懂
等到更懂得时候再补充吧
掰掰~