阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义

2023-05-16

常用文件夹分层:

  • pojo
    • vo (与前端交互的所有对象,包括接参和返回)
    • query (查询的筛选条件,前端传参和后端内部传参通用)
    • entity (数据库表基础对象)
    • dto(后端内部传输用,例如多张表字段合并到一个对象)

下面都是解释为什么这么做,不爱看可以跳过

分层领域模型规约:

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

原文:https://zhuanlan.zhihu.com/p/102389552
在这里插入图片描述
面对这个图,让我们先从承上启下的DTO开始入手

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

这个传输通常指的前后端之间的传输

DTO是一个比较特殊的对象,他有两种存在形式:

在后端,他的存在形式是java对象,也就是在controller里面定义的那个东东,通常在后端不需要关心怎么从json转成java对象的,这个都是由一些成熟的框架帮你完成啦,比如spring框架

在前端,他的存在形式通常是js里面的对象(也可以简单理解成json),也就是通过ajax请求的那个数据体

这也是为什么把他画成横跨两层的原因

这里可能会遇到个问题,现在微服务盛行,服务和服务之间调用的传输对象能叫DTO吗?
我的理解是看情况
DTO本身的一个隐含的意义是要能够完整的表达一个业务模块的输出
如果服务和服务之间相对独立,那就可以叫DTO
如果服务和服务之间不独立,每个都不是一个完整的业务模块,拆开可能仅仅是因为计算复杂度或者性能的问题,那这就不能够叫做DTO,只能是BO

VO(Value Object)值对象
VO就是展示用的数据,不管展示方式是网页,还是客户端,还是APP,只要是这个东西是让人看到的,这就叫VO
VO主要的存在形式就是js里面的对象(也可以简单理解成json)

VO和DTO的区别
主要有两个区别
一个是字段不一样,VO根据需要会删减一些字段
另一个是值不一样,VO会根据需要对DTO中的值进行展示业务的解释
举个简单的例子
DTO可能是这样的

{
“gender”:“男”,
“age”:35
}
对于业务一来说只需要性别,而且因为是一个古风聊天室,也不能直接展示男,因此经过业务解释业务一的VO是

{
“gender”:“公子”
}
对于业务二来说只需要年龄,而且不需要精确的年龄,因此经过业务解释业务二的VO是

{
“age”:“30~39”
}

PO(Persistant Object)持久对象
PO比较好理解
简单说PO就是数据库中的记录,一个PO的数据结构对应着库中表的结构,表中的一条记录就是一个PO对象
通常PO里面除了get,set之外没有别的方法
对于PO来说,数量是相对固定的,一定不会超过数据库表的数量
等同于Entity,这俩概念是一致的

BO(Business Object)业务对象
BO就是PO的组合
简单的例子比如说PO是一条交易记录,BO是一个人全部的交易记录集合对象
复杂点儿的例子PO1是交易记录,PO2是登录记录,PO3是商品浏览记录,PO4是添加购物车记录,PO5是搜索记录,BO是个人网站行为对象
BO是一个业务对象,一类业务就会对应一个BO,数量上没有限制,而且BO会有很多业务操作,也就是说除了get,set方法以外,BO会有很多针对自身数据进行计算的方法
为什么BO也画成横跨两层呢?原因是现在很多持久层框架自身就提供了数据组合的功能,因此BO有可能是在业务层由业务来拼装PO而成,也有可能是在数据库访问层由框架直接生成
很多情况下为了追求查询的效率,框架跳过PO直接生成BO的情况非常普遍,PO只是用来增删改使用

BO和DTO的区别
这两个的区别主要是就是字段的删减
BO对内,为了进行业务计算需要辅助数据,或者是一个业务有多个对外的接口,BO可能会含有很多接口对外所不需要的数据,因此DTO需要在BO的基础上,只要自己需要的数据,然后对外提供
在这个关系上,通常不会有数据内容的变化,内容变化要么在BO内部业务计算的时候完成,要么在解释VO的时候完成

OK,到这里这些关系基本就理清楚了

等等,DO是什么
DO呢,标题不是还有个DO么?
上面这些概念基本上已经涵盖了全部的流程,DO只是跟其中一个概念相同
但是跟哪个概念相同呢?
现在主要有两个版本
一个是阿里巴巴的开发手册中的定义
DO( Data Object)这个等同于上面的PO
另一个是在DDD(Domain-Driven Design)领域驱动设计中
DO(Domain Object)这个等同于上面的BO

最后,让我们再说说实际应用
这几个概念很完整,我们在用的时候是必须按这个来做吗?
当然不是的,系统和系统的复杂度不同,协作水平不同,完全没有必要教条主义,这些概念全上
上哪些概念,省哪些,我给一些实际建议
1,PO这个没法省,不管叫PO还是Entity,怎么着都得有
2,一些工具类的系统和一些业务不是很复杂的系统DTO是可以和BO合并成一个,当业务扩展的时候注意拆分就行
3,VO是可以第一个优化掉的,展示业务不复杂的可以压根儿不要,直接用DTO

原文:https://blog.csdn.net/MacWx/article/details/122618986

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义 的相关文章

  • Archlinux中普通用户无法使用root设置的zsh主题样式

    Archlinux中普通用户无法使用root设置的zsh主题样式 问题分析解决方法1 使用git到github上下载 注意要在普通用户下 2 查看当前主题3 查看可用主题 xff0c 选取下想用的主题4 编辑配置文件 xff0c 更换你想用
  • ArchLinux安装完成登陆时出现login incorrect错误

    汇总下来出现该错误有以下几种原因 1 输入密码时 xff0c 检查numlock是否开启 xff1b 使用字母上方的数字键进行输入 由于安装的linux键盘布局为us键盘布局 xff0c 小键盘在开机时 xff0c 默认为关闭状态 2 有人
  • VirtualBox中如何释放鼠标

    相信在使用VritualBox的小伙伴中 xff0c 有发现他释放鼠标的方式和VMware不一样 xff0c 其实也很简单 xff0c 并且VritualBox也有说明释放的方式 按键盘右边的Ctrl键就可以
  • c++中sizeof()的详细用法

    sizeof 定义 sizeof是一个操作符 xff08 operator xff09 其作用是返回一个对象或类型所占的内存字节数 sizeof 语法 sizeof有三种语法形式 xff1a 1 sizeof object sizeof 对
  • Linux下如何查找特定的文件

    使用 find命令 语法 xff1a find path options params 作用 xff1a 在指定目录下查找文件 常用用法示例 xff1a find name file java xff1a 精确查找文件 xff08 在根目录
  • Ubuntu16.04使用教程(一)——安装

    Ubuntu16 04使用教程 xff08 一 xff09 安装 前言 最近我同学需要用Ubuntu16 04做项目 xff0c 可是她之前从没用过 xff0c 于是我在这里写一些我常用的简单的操作吧 本节将教你如何在你的Windows电脑
  • Linux环境下QT开发(三)——QT编程基础

    Linux环境下QT开发 xff08 三 xff09 QT编程基础 在上一篇文章中 xff0c 我们完成了第一个程序 HelloWorld 在这篇文章中 xff0c 我将介绍一些QT编程基础知识 xff0c 让我们由此进入QT的世界 xff
  • Kali学习笔记(三)——Kali2020.1安装从入门到入土

    Kali学习笔记 xff08 三 xff09 Kali2020 1安装从入门到入土 我的笔记本是神舟战神Z7M KP7GT xff0c 配置如下 xff1a 项目配置CPU酷睿i7内存8GB显卡1050Ti固态硬盘128GB机械硬盘1TB
  • VP9编码(1)-- 简介

    VP9编码 xff08 1 xff09 简介 VP9是谷歌基于VP8发布的新版视频编解码标准 xff0c 主要对标H265 H264标准 youtube目前采用VP9标准 本系列博客为博主学习笔记 xff0c 翻译自 vp9 bitstre
  • c++学习之路

    3 19 内存分区模型 内存四区意义 不同区域存放的数据 xff0c 赋予不同的生命周期 给我们更大的灵活编程 程序exe 运行前分为 代码区和全局区 xff1b 运行后分为 栈区和堆区 1 代码区 存放CPU执行的机器指令 存放函数体的二
  • RTSP协议(2)——摘要(RFC2326)

    RTSP协议 xff08 2 xff09 摘要 实时流协议 xff08 RTSP xff09 是一种应用级协议 xff0c 用于控制实时数据的传输 RTSP提供了一个可扩展的框架 xff0c 以实现实时数据 xff08 如音频和视频 xff
  • 简道云-第3章-表单

    title 简道云 第3章 表单 date 2022 06 11 09 07 10 tags 简道云 categories 简道云 简道云 第3章 表单 背景介绍 简道云三个基本项目表单 流程以及仪表 关于它们的介绍可以参照官方文档表单 v
  • 搭建Hexo博客-第2章-Hexo基本用法

    搭建Hexo博客 第2章 Hexo基本用法 搭建Hexo博客 第2章 Hexo基本用法 搭建Hexo博客 第2章 Hexo基本用法 大家好 xff0c 在上一篇文章中 xff0c 我们学习了 Git GitHub 和 Coding 的基本用
  • 群晖-第5章-Docker安装gitlab

    群晖 第5章 Docker安装gitlab 群晖安装gitlab可以只在内网访问 xff0c 也就不需要前面几章的内容 xff0c 但是我这个是通过外网HTTPS访问的 参考 xff1a Nas码农篇 xff1a 群晖Docker安装Git
  • 小应用记账本-第1章-需求分析

    小应用记账本 第1章 需求分析 这个专题是开发一个小应用 记账本的记录 一 项目背景 我从21年开始用挖财记账 xff0c 挖财记账最初可以免费导出账本的 xff0c 但是后来变成了会员收费功能 xff0c 到23年年初 xff0c 有一次
  • 小应用记账本-第2章-数据库设计

    小应用记账本 第2章 数据库设计 在上一章 小应用记账本 第1章 需求分析 已经罗列了我们需要的功能 xff0c 因为很简单 xff0c 所以这一章就来设计数据库吧 Account表 xff1a 账户表 字段名类型说明取值idint账户id
  • Ae项目中,GPU加速不能使用了。视频预览显示应不少于2个帧或多帧,以及VR效果不能使用GPU加速!

    首先 xff0c 如果百度上的其他方法没有帮助到你 我这里还有另外一种方法 点击文件菜单下的项目设置 xff0c 看是否如图所示 如果可以的话 xff0c 点个关注支持一下 xff1a https space bilibili com 73
  • CCF A类会议或期刊----近两年对比学习相关论文

    工具代码位置 期待您的PR 会议 期刊论文sigmod2021Explaining Black Box Algorithms Using Probabilistic Contrastive Counterfactuals neurips20
  • 您还在为您公司的网络限制摸不了鱼在苦恼难过吗?难受的话请您看完:解决公司内网限制 Nginx反向代理访问外网

    1 nginx安装 xff08 在这里就不赘述了 xff09 2 修改nginx conf xff08 直接复制可用 xff09 worker processes 4 error log var logs nginx log info 日志
  • 切换系统默认语言后,Eclipse代码自动补全快捷键失效。

    今天心血来潮 xff0c 把Win10的默认语言切换成了英文 xff0c 想锻炼下英语 然后在打开Eclipse敲代码的时候尴尬了 xff0c 平时输入syso后按alt 43 能自动补全 xff0c 现在怎么不管用了 xff01 之后找到

随机推荐