首先来看看他们的全称分别都叫什么吧
- 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{ private Long id; private String uniqueOrderNo; private String phone; }
|
1 2 3 4 5 6 7 8 9 10 11
| @Data public class OrderItem { private Long id; private Long orderId; 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 { 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{ private String productId; private Integer quantity; }
|
1 2 3 4 5 6
| private static class OrderPay{ private String payType; private String panNo; }
|
好了,好像有一点点更懂了但是没完全懂
等到更懂得时候再补充吧
掰掰~