DO、DTO、BO、VO各种对象的区别

首先讲下作用,大致概括为两点:

对于分层设计定义的应用类,最底层是数据存储层,也就是数据库,最上层是对外提供接口调用的应用层,每一层都有关联的数据对象,定义对应的应用类方便区分
让语义明确,直观的就分析出类的含义

《阿里巴巴Java开发规范》关于领域模型的部分介绍如下:
分层领域模型规约:
DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。
DTO(Data Transfer Object):数据传输对象,ServiceManager 向外传输的对象。
BO(Business Object):业务对象,由 Service 层输出的封装业务逻辑的对象。
AO(ApplicationObject):应用对象,在Web层与Service层之间抽象的复用对象模型, 极为贴近展示层,复用度不高。
VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。

POJO(Plain Ordinary Java Object):在本规约中,POJO专指只有setter/getter/toString的简单类,包括DO/DTO/BO/VO等。
**

详细各个词的定义:

**

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

  • DTO(Data Transfer Object):数据传输对象,Service或Manager向外传输的对象。
  • BO(Business Object):业务对象。可以由Service层输出的封装业务逻辑的对象。
  • Query:数据查询对象,各层接收上层的查询请求。额外规定:【强制】超过2个参数的查询封装,禁止使用Map类来传输。
  • VO(View Object):显示层对象,通常是Web向模板渲染引擎层传输的对象。

DAO: Data Acess Object,数据访问对象,这个我们不陌生,跟数据库打交道的系统都会有这样的DAO类,主要的作用:

  • 封装对数据库的访问,常规的增删改查(CRUD操作)都通过DAO来实现。

PO/DO: Persistent Object / Data Object,持久对象 / 数据对象。

  • 跟数据库表是一一对应的,一个PO/DO 数据是表的一条记录。
  • 以前用Hibernate 的时候PO用的很多,现在普遍喜欢用 DO,这个看各个公司自己的规范。
  • PO / DO 只是数据的对象,不包含任何的操作。举个例子,学生表是StudentDO,对学生表的增删改查等操作就是StudentDAO。

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

  • 在分布式系统中,系统之间可以通过DTO进行数据传输;
  • DTO也可以在应用内部,核心层和应用层之间传递数据,DTO只是简单的数据传输,没有业务逻辑的处理;
  • 有的场景,比如数据库表有10个字段,id(唯一id)、version(版本号),gmt_create(记录创建时间)
    这些字段不需要对外提供,所以DTO 可以只取有含义的业务字段,DO是和数据库记录的一一映射,但是DTO只需要按照业务需要定义需要的字段。

BO : Business Object, 业务对象

  • BO主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。

  • 在领域模型中,BO是个非常重要的概念, BO是最小的业务单元。

  • BO 包含数据对象(PO/DO)以及对数据的操作。

VO: View Object, 视图模型,展示层对象

  • 对应页面显示(web页面/移动端H5/Native视图)的数据对象。
示例代码

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

//请求VO转DTO
public List<UserDTO> getUsers(UserVO userVO);

//响应DTO转VO
public List<UserVO> getUsers(UserDTO userDTO);

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

// 普通的service层接口,对数据处理,返回DTO对象
//请求Controller中DTO转Service中BO
List<UserBO> getUsers(UserDTO userDTO);
//响应Service中BO转Controller中DTO
List<UserDTO> getUsers(UserBO userBO);

然后在Service内部使用UserBO封装中间所需的逻辑对象
DAO层
此层常见的转换为:BO转换为DO,与数据库进行交互

//请求BO转DO
List<UserDO> getUsers(UserBO userBO);
//响应DO转BO
List<UserBO> getUsers(UserDO userDO);

整体流程

//前端发起请求
//请求VO转DTO
public List<UserDTO> getUsers(UserVO userVO);

//请求Controller中DTO转Service中BO
List<UserBO> getUsers(UserDTO userDTO);

//请求BO转DO
List<UserDO> getUsers(UserBO userBO);
//------操作数据库完成-------

//响应DO转BO
List<UserBO> getUsers(UserDO userDO);

//响应Service中BO转Controller中DTO
List<UserDTO> getUsers(UserBO userBO);

//响应DTO转VO
public List<UserVO> getUsers(UserDTO userDTO);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值