写点什么

DTO、VO、BO、PO、DO 的用法区别,居然这么多人搞不清楚.....

作者:程序知音
  • 2023-03-10
    湖南
  • 本文字数:1661 字

    阅读完需:约 5 分钟

1、什么是 DTO、VO、BO、PO、DO、POJO

POJO 的定义是无规则简单的对象,在日常的代码分层中 pojo 会被分为 VO、BO、 PO、 DTO。通过各层 POJO 的使用,有助于提高代码的可读性和可维护性。

概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下。

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

在服务间的调用中,传输的数据对象

个人理解,DTO 是可以存在于各层服务中(接口、服务、数据库等等)服务间的交互使用 DTO 来解耦

VO (view object/value object)表示层对象

前端展示的数据,在接口数据返回给前端的时候需要转成 VO

使用场景,在接口层服务中,将 DTO 转成 VO,返回给前台

B0(bussines object)业务层对象

  • 主要在服务内部使用的业务对象

  • 主要在服务内部使用的业务对象

  • 使用场景,在服务层服务中,由 DTO 转成 BO 然后进行业务处理后,转成 DTO 返回到接口层

PO(persistent object)持久对象

出现位置为数据库数据,用来存储数据库提取的数据

只存储数据,不包含数据操作

使用场景,在数据库层中,获取的数据库数据存储到 PO 中,然后转为 DTO 返回到服务层中

DO(domain object)领域实体对象

DO 现在主要有两个版本:

  • ①阿里巴巴的开发手册中的定义,DO( Data Object)这个等同于上面的 PO

  • ②DDD(Domain-Driven Design)领域驱动设计中,DO(Domain Object)这个等同于上面的 BO

2、区别

《阿里巴巴 Java 开发规范》关于领域模型的部分介绍如下:

分层领域模型规约:

  • DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。

  • DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象。

  • BO(Business Object):业务对象,由 Service 层输出的封装业务逻辑的对象。

  • AO(ApplicationObject):应用对象,在 Web 层与 Service 层之间抽象的复用对象模型, 极为贴近展示层,复用度不高。

  • VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。

  • Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。

最难理解的是 BO,大致这么理解:

BO 这个对象可以包括一个或多个其它的对象。

比如一个简历,有教育经历、工作经历、社会关系等等。

我们可以把教育经历对应一个 PO,工作经历对应一个 PO,社会关系对应一个 PO。

建立一个对应简历的 BO 对象处理简历,每个 BO 包含这些 PO。这样处理业务逻辑时,我们就可以针对 BO 去处理。

3、示例代码

Controller 层

此层常见的转换为:DTO 转 VO,将 Services 层传过来的 DTO 转换成 VO 表示数据返回给前端

public List<UserVO> getUsers(UserQuery userQuery);
复制代码
Service 层、Manager 层

此层常见的转换为:DO 转 BO、BO 转 DTO

// 普通的service层接口,对数据处理,返回DTO对象
 List<UserDTO> getUsers(UserQuery userQuery);
复制代码

然后在 Service 内部使用 UserBO 封装中间所需的逻辑对象

DAO 层

此层常见的转换为:DTO 转换为 DO,与数据库进行交互

List<UserDO> getUsers(UserQuery userQuery);
复制代码

领域模型定义

  • Entity 表结构实体,对应 DO

  • BO 业务实体

  • VO 视图实体,DTO 可共用

  • 入参封装

    xxxParam

    Query xxx Param

    Save xxx Param

    Edit xxx Param

    Remove xxx Param

4、IDEA 插件完成转换

1、插件名称:Simple Object Copy

这个插件是收费的,好像是 6 元(人民币)每年,当然学生、教育机构、公益免费。

可以试用 30 天,好用不好用试试才知道,先来体验一下吧!

2、安装

安装就不多说了,直接在 idea 的 Plugins 应用商店搜索插件名就出来了,然后下载安装就好,安装好后会让重启 idea,那就重启呗,重启后选择 30 天的试用。


3、如何使用

定义方法出入参,出入参就是要转换的实体

光标定位方法内,使用快捷键ALT+INSERT(WIN) 、 command + N(mac) ,或者右键鼠标选择 Generate,弹出生成选项框后,选择 genCopyMethod,代码就生成好了


结果是这样的:

复杂对象转化展示:

5、结语

通过插件的使用

1、可以节省一个个字段的设置的开发时间

2、避免了漏字段设置,ps:前端同学总是来问为啥字段总是 null。

3、而且通过出入参的设计思想去开发,规范了代码,在有特殊请求转化的时候也比较方便。

作者:清如许

来源:macwx.blog.csdn.net/article/details/122618986


用户头像

程序知音

关注

还未添加个人签名 2022-06-25 加入

还未添加个人简介

评论

发布
暂无评论
DTO、VO、BO、PO、DO的用法区别,居然这么多人搞不清楚....._程序知音_InfoQ写作社区