史上最全的Java实体类VO,DTO,BO,DO解释

在这里插入图片描述
欢迎关注微信公众号:数据科学与艺术 作者WX:superhe199

阿里巴巴Java开发手册中的分层领域模型规约:

Query: 数据查询对象,各层接收上层的查询请求。注意超过2 个参数的查询封装,禁止使用 Map 类 来传输。
VO(View Object): 显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
DTO(Data Transfer Object): 数据传输对象,Service 或Manager 向外传输的对象。
BO(Business Object): 业务对象,可以由Service层输出的封装业务逻辑的对象。
DO(Data Object): 此对象与数据库表结构一一对应,通过 DAO层向上传输数据源对象。

领域模型命名规约:

1) 数据对象:xxxDO,xxx 即为数据表名。
2) 数据传输对象:xxxDTO,xxx为业务领域相关的名称。
3) 展示对象:xxxVO,xxx一般为网页名称。
4) POJO是 DO/DTO/BO/VO的统称,禁止命名成 xxxPOJO。

一、DO

数据对象 XxxDO

用法:

以DO 为结尾

Xxxx 与数据库表名保持一致

类中字段要与数据库字段保持一致,不能缺失或者多余

类中的每个字段添加注释,并与数据库注释保持一致

不允许有组合

二、BO(Business Object)

业务传输对象 BO,可以包括一个或多个其它的对象。
例如:学生的综合情况,需要学生的基本信息、成绩等。

用法:

不可以继承自 Entity

BO 对象不得用于 controller 层

三、DTO(Data Transfer Object)

这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载。
传输对象 XxxxDTO,是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。

简单来说,我们不需要把整个PO对象的全部字段传输到客户端,而是可以用DTO重新封装,传递到客户端。此时,如果这个对象用来对应界面的展现,就叫VO。

用法:

不可以继承自 Entity

DTO 可以继承、组合其他 DTO,VO,BO 等对象

DTO 只能用于前端、RPC 的请求参数

四、VO(View Object)

视图对象 XxxxVO,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。

用法:

不可继承自 Entity

VO 可以继承、组合其他 DTO,VO,BO 等对象

VO 只能用于返回前端、rpc 的业务数据封装对象

五、Query

数据查询对象Query,各层接收上层的查询请求。

注意超过2 个参数的查询封装,禁止使用 Map 类 来传输。

### JavaVOBODTO、PO 的转换方法 在Java开发中,为了保持不同层次间的解耦合以及数据的安全性和一致性,通常会使用不同的对象模型来表示同一逻辑实体的不同视图。这些对象包括VO(View Object)、BO(Business Object)、DTO(Data Transfer Object)和PO(Persistent Object)。下面将介绍如何在这几种对象之间进行转换。 #### 使用 MapStruct 实现自动映射 MapStruct 是一种用于简化间属性复制工作的框架,可以减少手动编写繁琐的转换代码。通过定义接口并标注特定注解即可实现高效的双向映射功能[^1]。 ```java @Mapper(componentModel = "spring") public interface EntityDtoMapper { UserBo userPoToUserBo(UserPo po); UserDto userBoToUserDto(UserBo bo); } ``` 此段代码展示了从`UserPo`(持久化对象)到`UserBo`(业务对象),再到`UserDto`(传输对象)的过程。借助于MapStruct自动生成具体的实现完成实际的对象转换工作。 对于VO(视图对象), 如果前端请求或响应需要特殊格式的数据,则可以在控制器层进一步处理: ```java @RestController @RequestMapping("/users") public class UserController { @Autowired private UserService userService; @GetMapping("/{id}") public ResponseEntity<UserVo> getUser(@PathVariable Long id){ UserDto dto = userService.getUserById(id); // 假设这里有一个dtoToVo的方法来进行最终转换 return new ResponseEntity<>(dtoToVo(dto), HttpStatus.OK); } } private static UserVo dtoToVo(UserDto dto){ UserVo vo = new UserVo(); BeanUtils.copyProperties(dto,vo); // 可能还需要额外设置一些只读字段或者其他不适合放在DTO中的信息 return vo; } ``` 上述例子说明了当接收到HTTP GET请求时,先调用服务获取DTO实例,之后将其转化为适合前端使用的VO实例返回给客户端[^2]。 另外值得注意的是,在某些情况下可以直接利用DTO作为VO传递给前端而不需要单独创建VO,尤其是在两者结构非常相似的情况下这样做能够有效降低系统的复杂度[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贺公子之数据科学与艺术

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值