JAVA中PO、VO、BO、POJO、DAO、DTO、TO的理解

news2024/9/23 1:26:42

目录

1.阿里规范

1.1.Service/DAO 层方法命名规约

1.2.领域模型命名规约

1.3.命名风格

2.简单类:包括 DO/DTO/BO/VO 等

3.与MVC三层架构的关系

4.总结

4.1.为什么要分这些对象

4.2.什么时候需要定义这么多O

4.3.实体对象之间如何转换?

参考资料


1.阿里规范

首先看看阿里开发手册中关于POJO/DO/DTO/BO/VO的相关描述内容。

1.1.Service/DAO 层方法命名规约

1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀。
3) 获取统计值的方法用 count 做前缀。
4) 插入的方法用 save(推荐)或 insert 做前缀。
5) 删除的方法用 remove(推荐)或 delete 做前缀。
6) 修改的方法用 update 做前缀。

1.2.领域模型命名规约

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

1.3.命名风格

【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。
       正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion
       反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion

【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。(四) OOP 规约
【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
       反例::POJO 类的 createTime 默认值为 new Date(),但是这个属性在数据提取时并没有置入具体值,在更新其它字段时又附带更新了此字段,导致创建时间被修改成当前时间。

2.简单类:包括 DO/DTO/BO/VO 等

DTO(Data Transfer Object)数据传输对象
用于不同应用的数据传输
DAO (Data Access Object)数据访问对象

        是一个数据访问接口,主要是与数据库交互。主要用来封装对数据的访问,注意,是对数据的访问,不是对数据库的访问。

DO(Data Object)

        阿里巴巴专指数据库表一一对应的 POJO 类。

DO (Domain Object)领域对象
        领域对象 DO 是从现实世界中抽象出来的有形或无形的业务实体。在与数据有关的操作中数据存在数据库使用DAO访问被取出来时,一般会将这些数据规范化的定义成类,而这个类就是DO,用来接收数据库对应的实体,它是一种抽象化的数据状态,介于数据库与业务逻辑之间。

一般在 业务逻辑层(Service) 对 数据库(SQL) 的 访问时 接收数据 使用。

xxxDO,xxx即为数据表名

另外:DO与Entity概念上浅显的相同,他们在实际应用中是一个东西。稍微的不同点就是DO是与数据库存在着某种映射关系的Entity,总的来说DO是Entity的一种。

VO(View Object)视图模型
        用于和前端的交互,接受前端回传的数据,返回给前端,做视图展示

xxxVO,xxx一般为网页名称。

AO(Application Object)应用对象
        AO是一个较为笼统的概念,因为太过于常见而并没有刻意的去描绘它的细节。举一个很简单的栗子:控制层(Controller) 在 业务逻辑层(Service) 查询一条或多条数据,这个数据的传输过程的运载就是AO完成。在正常的业务逻辑中一般都有很多种类型的数据,例如 整形、字符型、集合、类 等,我们把它统称为AO。

在**控制层(Controller)**与 **业务逻辑层(Service)**层之间抽象的复用对象模型,有时候极为贴近展示层,复用度不高。

BO( Business Object)业务对象
        业务对象(Business Object,BO)是对数据进行检索和处理的组件。主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。形象描述为一个对象的形为和动作,当然也有涉及到基它对象的一些形为和动作。

一般用在包含业务功能模块 的具体实例上,比如我们写了一个Controller、一个Service、一个DAO、一个工具类等等这一系列实例组合后能实现一些功能,这些一系列实例组合为一个组件,这个组件就是BO。

POJO( Plain Ordinary Java Object)纯普通Java对象
        POJO 专指只有 setter/getter/toString 的DTO。总的来说POJO包含DO、DTO、BO、VO,这些本质上都是一个简单的java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称

PO(Persistent Object)持久化对象
    
与数据库的属性和字段一一对应

Entity(应用程序域中的一个概念)实体
        Entity(应用程序域中的一个概念)
实体

        Eitity是一个未被持久化的对象,它是一个类,从现实抽象到代码的一个类。

Model (概念实体模型)实体类和模型
        Model是计算机程序设计中有两个概念:一个是三层架构中的
实体类,另一个是MVC架构中的模型。

3.与MVC三层架构的关系

        在“三层架构”中,为了面向对象编程,将各层传递的数据封装成实体类,便于数据传递和提高可读性。

        在MVC(模型Model-视图View-控制器Controller)模式中,Model代表模型,是业务流程/状态的处理以及业务规则的制定,接受视图请求的数据,并返回最终的处理结果。View代表视图,用来解析Model带来的数据模型。业务模型的设计可以说是MVC最主要的核心。

        通常意义上的三层架构就是将整个业务应用划分为:表现层、业务逻辑层、数据访问层。区分层次的目的即为了“高内聚,低耦合”的思想。

表现层(web):用于接收用户提交请求及响应处理。
业务逻辑层(service):对数据业务逻辑处理。
数据访问层(dao):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等

在这里插入图片描述

4.总结

PO持久对象:与数据库的属性和字段一一对应

DO领域对象:基于实体和事件的业务对象,在构建复杂的系统的时候,采用领域驱动的设计思想,可以降低开发的复杂度

DTO数据传输对象:用于不同应用的数据传输,分布式,微服务的名称

VO值对象:用于和前端的交互,接受前端回传的数据,返回给前端,做视图展示

BO业务对象:封装多个PO,在Service层处理各种业务

4.1.为什么要分这些对象

因为在不同的业务中,同一个对象的作用是不同的,比如添加用户需要密码,但是查看信息,就只能返回部分的信息,甚至敏感信息要特殊处理,虽然有注解可以帮助我们解决这些问题,但是,处理的并不全面,而且不能视情况处理,反而增加了业务的复杂度
减少业务直接的耦合,当我们的需求有变动的时候,我改变字段的内容,不会影响到其他的业务的正常执行
让程序员做到见名知意,我们在命名对象的时候,就要以XXXDO,xxxVO命名,这样其他程序员在维护我们代码的时候,也知道应该怎么处理这些信息

4.2.什么时候需要定义这么多O

项目中真的有必要定义VO,BO,PO,DO,DTO吗?按照理论上来讲

如果项目比较小,是一个简单的MVC项目,又是单兵作战,我不建议使用VO,BO,PO,DO,DTO,直接用POJO负责各个层来传输就好,因为这种项目的“目的地”是快速完成。
而我们更多的时候,是持续迭代的团队协作项目,这个时候我们就建议用VO,BO,PO,DO,DTO,而且团队内要达成共识,形成一个标准规范。

4.3.实体对象之间如何转换?

BeanUtils.copyProperties(srcVo,destDto);
mapper.map(srcVo,DestDto.class);

参考资料

参考深入理解 DAO的概念_旷野历程的博客

概念POJO晓风残月淡的博客

《阿里Java 开发手册黄山版》

vo、dto、bo、do、po的概念理解Albertliuc的博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/510966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ground-aware Monocular 3D Object Detection for Autonomous Driving论文

1 摘要 摘要:使用单个RGB相机估计环境中物体的3D位置和方向是低成本城市自主驾驶和移动机器人的一项至关重要的挑战性任务。大多数现有算法基于二维-三维对应中的几何约束,这源于一般的6D目标姿态估计。我们首先确定地平面如何在驾驶场景的深度推理中提…

RT-Thread 5.0.1 qemu-virt64-aarch64 解决编译问题

前言 最近在最新的 RT-Thread 上搭建 bsp qemu-virt64-aarch64 的编译环境,发现较新的 gcc 交叉编译器编译失败了。 经过尝试较旧版本的 gcc 交叉编译工具链,终于编译通过了 下载 gcc 交叉编译工具链,这里推荐使用 arm 官方的 gcc 下载地址…

Apache Shiro 1.2.4反序列化漏洞(Shiro-550)--Shiro rememberMe反序列化漏洞(CVE-2016-4437)

前言 Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。 Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用S…

sort、uniq、tr、cut命令的使用

sort、uniq、tr、cut命令的使用 一、sort二、uniq三、tr四、cut 一、sort sort是一个以行为单位对文件内容排序的工具,也可以根据不同的数据类型来排序,例如数据和字符的排序就不一样。比较原则是从首字符向后,依次按ASCII码进行比较&#x…

MySQL-索引(1)

本文主要梳理的内容 : 主键索引的基本概念InnoDB引擎中的索引策略索引的分类(各种索引讲解)索引的创建索引的底层数据结构 目录 主键 InnoDB主键生成策略 数据库自增主键可能遇到什么问题. 如何选择合适的分布式主键方案呢? 超键、候选键、主键、外键分别是什…

第一个Mapreduce程序-wordcount

一个Maprduce程序主要包括三部分&#xff1a;Mapper类、Reducer类、执行类。 Maven项目下所需依赖 <dependencies><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>3.3.0</v…

前端011_标签模块_列表功能

标签模块_列表功能 1、需求分析2、Mock添加数据列表模拟接口3、Api调用接口4、列表模版5、分页查询实现1、需求分析 标签模块主要文章标签进行管理,类别和标签的关系是一对多,一个类别下面存在多个标签。 首先开发模块中的列表功能,包含数据列表、分页。 2、Mock添加数据…

golang基于FFmpeg实现视频H264编解码

文章目录 一、基本知识1.1 FFmpeg相关1.2 H.264相关1.3 YUV相关 二、H264编码原理2.1 帧类型分析2.2 帧内/帧间预测2.3 变换量化2.4 滤波2.5 熵编码 三、H264解码为YUV3.1 代码逻辑及使用API3.2 具体代码实现3.3 YUV文件播放 四、YUV编码为H2644.1 代码逻辑及使用API4.2 具体代…

Python基础入门编程代码练习(二)

一、求1~100之间不能被3整除的数之和 循环条件&#xff1a;i<100循环操作 实现代码如下&#xff1a; def sums():sum 0for num in range(1, 101):if num % 3 ! 0:sum numprint("1~100之间不能被3整除的数之和为&#xff1a;%s" % (sum))sums() print("1~…

测试 —— 基础概念、开发模型、测试模型、BUG的描述

目录 一、什么是软件测试&#xff1f; 1. 调试和测试的区别 2. 优秀的测试人员需要具备的哪些素质 二、基本名词的概念 1. 什么是需求&#xff1f; 2. 什么是BUG&#xff1f; 3. 什么是测试用例&#xff1f; 4. 软件的生命周期&#xff1f;软件测试的生命周期&#xff1…

实验六 触发器与存储过程

实验六 触发器与存储过程 目录 实验六 触发器与存储过程 1、SQL触发器&#xff1a;删除学生数据题目代码题解 2、SQL触发器&#xff1a;创建成绩表插入触发器题目代码题解 3、 SQL存储过程&#xff1a;查询订单题目代码题解 4、SQL存储过程&#xff1a;建立存储过程&#xff0c…

ESP32设备驱动-Si4703调频收音机模块驱动

Si4703调频收音机模块驱动 文章目录 Si4703调频收音机模块驱动1、Si4703介绍2、硬件准备3、软件准备4、驱动实现1、Si4703介绍 Si4702/03 FM 无线电接收器系列通过小尺寸和电路板面积、最少的组件数量、灵活的可编程性以及卓越的、经过验证的性能,增加了向移动设备添加 FM 无…

4。计算机组成原理(5)总线和I/O

嵌入式软件开发&#xff0c;非科班专业必须掌握的基本计算机知识 核心知识点&#xff1a;数据表示和运算、存储系统、指令系统、总线系统、中央处理器、输入输出系统 一 总线概述 总线是一组能实现多个部件间信息传输的线路 按功能分类 1&#xff09;片内总线&#xff08;片…

【iOS】多线程以及GCD和NSOperation

iOS多线程 线程基础进程与线程NSThread类 GCD认识GCD任务队列队列与任务结合线程间通信队列组dispatch group延迟执行操作 NSOperation简介基本使用NSOperation、NSOperationQueue 常用属性和方法归纳NSOperation 常用属性和方法NSOperationQueue 常用属性和方法 小结 线程基础…

网易Android framework开发岗面试经历分享(附面试题汇总+案例解析)

背景 今年可以说是非常难&#xff0c;部门被拆&#xff0c;很多同事都被变相裁员了&#xff0c;虽然说去其他部门工作可以给我们的放宽一点要求&#xff0c;但我还是想在Android开的岗位上发展&#xff0c;所以也提出了离职&#xff1b;离职后的两个月中&#xff0c;投了一些A…

类ChatGPT逐行代码解读(1/2):从零实现Transformer、ChatGLM-6B

前言 最近一直在做类ChatGPT项目的部署 微调&#xff0c;关注比较多的是两个&#xff1a;一个LLaMA&#xff0c;一个ChatGLM&#xff0c;会发现有不少模型是基于这两个模型去做微调的&#xff0c;说到微调&#xff0c;那具体怎么微调呢&#xff0c;因此又详细了解了一下微调代…

tensorflow GPU训练环境布置

tensorflow GPU训练环境布置 一、显卡驱动安装1.1 如何处理**Failed to initialize NVML: Driver/library version mismatch的问题**1.2 卸载旧的版本1.3 驱动安装 1.3.1 利用apt 安装1.3.2 手动安装 二、安装CUDA2.1 确定CUDA版本2.2 下载文件1. 找匹配版本2. 选合适的平台 2…

微服务---Redis实用篇-黑马头条项目-商户查询缓存功能(缓存穿透,缓存雪崩,缓存击穿问题及解决思路)

1、商户查询缓存 1.1 什么是缓存? 前言:什么是缓存? 就像自行车,越野车的避震器 举个例子:越野车,山地自行车,都拥有"避震器",防止车体加速后因惯性,在酷似"U"字母的地形上飞跃,硬着陆导致的损害,像个弹簧一样; 同样,实际开发中,系统也需要"避震…

libcad.so Crack,转换为多种文件格式

libcad.so Crack,转换为多种文件格式 支持所有流行的2D和3D CAD格式。 高速准确的可视化。 轻松访问CAD实体属性&#xff0c;包括坐标、文本、图层等。 转换为多种文件格式。 从DWG和DXF文件生成G代码。 Unicode支持。 libcad.so是一个用于Linux的库。它可以将CAD功能添加到不同…

【笔试强训选择题】Day11.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…