POJO,Entity,model,domain,view,DTO,VO,Param这些分别都是什么含义?怎样理解?

目录

1. 前言

2. POJO的含义

3. entity(实体)

4. model(模型)

5. domain(域) 

6. view(视图)

7. DTO(数据传输对象)

8. VO(真正视图层)

9. Param(参数)

10. 总结


1. 前言

在日常开发的过程中,如果我们接手一个新的项目之后,通常会有各种各样的包,想要搞清楚项目的基本架构,当然就需要知道各种包做什么用的,里面存放了那些东西。以便于我们理解项目的整体结构。

我们都知道项目是要和数据库打交道的,数据库中的一张表映射到Java代码种是一个实体类。在形目中,我们通常会发现实体类用很多种不同的定义方法,有叫 entity 的,有叫 domain 的,有叫 model 的,有叫 pojo 的,到底哪一种是最规范的呢?本篇我们就来说说它们的区别。

2. POJO的含义

POJO 英文全称"Plain Ordinary Java Object",译为普通的Java对象,就是我们常说的 JavaBean 对象。在 JavaBean 对象中,通常会定义 Getter 和 Setter 方法以便于我们在业务层对对象属性值的存取操作。

而 entity,domain,model,view,DTO,VO都可以理解为 JavaBean,也都可以理解为POJO,POJO是它们的抽象,但是细分它们的区别,还是会有所不同的。

3. entity(实体)

entity 实体类中的属性通常与数据库中的一张表的字段完全相应

如下是一张用户表 user,表中有以下六个字段值;

那么 user 表对应的 entity 实体类 User 如下所示,通常类中的字段会与数据库表中的字段一一对应;

@Data
public class User {private Long uid;private String username;private String password;private int age;private String email;private String sex;
}

除此之外,还会有一些特殊情况,比如所有的 entity 类可能都会继承某个基类 BaseEntity;

就拿上面的 user 表来说,如果 user 数据库表中定义了BaseEntity类中的四个字段,通常都是需要去继承BaseEntity类的;

如果 user 数据库表中没有定义BaseEntity类中的四个字段,那么user类可以选择继承BaseEntity类,也可以选择不继承BaseEntity类。

换句话来说就是,JavaBean类中定义的属性可以比数据库表中的字段多,也可以和数据库表中的字段相等,也可以比数据库中的字段少;但一般情况下都是一一对等的关系。

@Data
public class BaseEntity {private String createUsername;private Date createTime;private String updateUsername;private Date updateTime;
}

4. model(模型)

model 实体类中的属性通常可能含有数据库中多张表的字段

有些业务中,我们可能会去操作多张表。

举个例子,假如说某个业务需要查询AB两张表,A表中有一个a1,a2,a3字段,B表中有一个b1,b2,b3字段。

SELECT *
FROM A INNER JOIN
ON A.a1 = B.b1
WHERE A.a2 = #{model.a2} AND B.b2 = #{model.b2}

这个时候,加入我们想要用一个实体类传参达到效果,就必然要求这个实体类中既含有A类中字段属性,有含有B表中的字段属性;这种实体类我们就可以称之为 model 实体类

@Data
public class SelectModel {private String a2;private String b2;
}

5. domain(域) 

domain 中通常可能含有多张表映射的Java对象

还有一种业务需求,可能需要查询多张表,然后将查询到的数据全部返回;

此时我们就可以创建另外一种实体类,该实体类中的属性不是八种基本数据类型,而是其他自定义实体类,我们将查询到但表数据封装到对应的实体类中,再将多张表查询到的数据汇总到一起封装到 Domain 类中,这就是域

@Data
public class SelectDomain {private xxxEntity1 entity1;private xxxEntity2 entity2;private xxxEntity2 entity3;
}

6. view(视图)

view 中通常含有数据库中多张表的部分字段;

视图我们就可以理解为呈现的东西,在程序中,视图就是展示给用户的数据。

举个栗子:如下为用户表对应的实体类 User;

@Data
public class User {private Long uid;private String username;private String password;private int age;private String email;private String sex;
}

在实际的业务中,假设用户登陆成功,我们不一定需要将用户的密码也展示出来,也不一定需要将用户的ID展示出来,假设用户登陆后只显示用户名和邮箱,我们就重新定义一个视图实体类 UserView,里面只定义username和email两个属性;

由此就有了视图 view,在 view 中,我们只会定义需要展示给用户看的字段属性;

这样我们在进行数据库查询的时候,也是只查询这两个字段的值,返回值类型就是用 UserView 来接收,而不使用 User 实体类来接收;

@Data
public class UserView {private String username;private String email;
}

7. DTO(数据传输对象)

这个其实和刚才我们说的 view 是有非常类似的,只是叫法不同,就不做过多的叙述了;

8. VO(真正视图层)

VO 就是我真正展示给用户去看的数据字段;

VO全称 View Object,视图对象,很多小伙伴可能会有疑惑,DTO和view不是已经起到了视图层数据传输的效果了吗?为什么还要使用VO呢?

其实不然,小伙伴们可能知道,在一些庞大复杂的项目中,数据库表和表之间的外键约束会非常密切,这样一来,我们数据库表中存储的数据大多都是其他表的主键ID,并不会存储具体的信息。

这样一来,我们数据库查询之后得到了一堆其它表的主键ID,但这并不是我们想要的结果,所以我们需要在业务层再去根据这些主键ID去各自对应的数据库表中查询用户想要的数据,然后在返回,查询到的数据我们通常会使用VO类来进行接收,查询完毕,我们将VO返回给前端展示,这才算是一个业务流程真正完成。

9. Param(参数)

通常封装对数据库中字段做修改的数据或查询条件属性;

业务层中的方法,大多都会采用实体类型传参,因此通常会定义一个xxxParam实体类,实体类中封装一些要对数据库表中字段进行修改的操作或是查询条件字段;

10. 总结

虽然上面它们细分下来会有一些不同,但在实际的项目中,开发人员不一定会严格按照它们的规范去进行开发,但一个项目中一般都会包含以下集中实体类型。

第一种:entity 实体数据访问层,专门用来对数据库单表进行数据操作;

第二种:view,DTO数据传输层,通常用作接收单表或夺表查询到的部分字段;

第三种:VO视图层,通常用于存储页面真正展示的数据;

第四种:Param 参数实体,通常用于封装前端传递过来的数据,后端可以根据Param中的参数对单表或多表进行CRUD操作;

参考:史上最全总结!Util、POJO、domain、entity、model、DAO、DTO、view、mapper、service、controller的作用和区别分析_model entity view-CSDN博客

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

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

相关文章

浅谈免杀下的持久化

文章目录 前记注册表计划任务COM劫持后记reference 前记 实战中持久化的手段常用的就是加服务、添改注册表、加计划任务、劫持等,这里探索c/c下的维权免杀 注册表 用户级 \HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run \HKEY_CURRENT_USER…

代码随想录算法训练营DAY36|C++贪心算法Part.5|435.无重叠区间、763.划分字母区间、56. 合并区间

文章目录 435.无重叠区间按右边界排序CPP代码 按左边界排序如何判断相邻区间是否重叠如何判断一下一个区间与当前相邻区间是否重叠总结CPP代码 763.划分字母区间思路伪代码实现CPP代码 56. 合并区间思路CPP代码 435.无重叠区间 力扣题目链接 文章链接:435.无重叠区间…

Python 0基础_变现_38岁_day 15(匿名函数)

匿名函数: 不用定义函数名,无需使用def关键字,使用lambda将函数写成一行;#使用匿名函数定义一个两个数字相加的函数add lambda x,y : xy #使用变量接收匿名函数的内容,且变量名作为调用函数的变量名&#xff1…

EasyRecovery数据恢复软件2025破解版安装包下载

EasyRecovery数据恢复软件的主要功能及使用教程。coco玛奇朵可以提供一个概要和简化的教程,以便你了解其基本内容和操作步骤。 EasyRecovery绿色破解下载网盘链接: https://pan.baidu.com/s/1_6NmcOh_Jmc-DGc4TJD-Mg?pwddq4w 提取码: dq4w 复制这段内容后打开百度…

强固型工业电脑在称重系统+叉车电脑,称重量体扫码一体机,物流分拣线工作站行业应用

称重系统叉车电脑行业应用 背景介绍 在叉车上安装称重传感器,通过对举升压力的自动检测,将压力信号转换为电流或电压信号,经过A/D转换,使模拟信号变为数字信号,经微处理器进行数据处理后通过蓝牙、串口或者USB接口将称…

dial tcp 192.168.0.190:443: connect: connection refused

1、场景 用nerdctl登录镜像仓库192.168.0.190(Harbor),报错 ERRO[0006] failed to call tryLoginWithRegHost error"failed to call rh.Client.Do: Get \"https://192.168.0.190/v2/\": dial tcp 192.168.0.190:…

【数据结构】图(Graph)

文章目录 概念图的存储方式邻接矩阵邻接矩阵表示法邻接矩阵表示法的特点 邻接表邻接表表示法邻接表表示法的特点邻接表表示法的定义与实现查找插入删除其它构造函数析构函数创建图输出图 图的遍历深度优先遍历(DFS)广度优先遍历 图的连接分量和生成树生成…

C#设计树形程序界面的方法:创建特殊窗体

目录 1.TreeView控件 2.实例 (1)Resources.Designer.cs (2)Form1.Designer.cs (3)Form1.cs (4)生成效果 以树形来显示程序的菜单,可以更直观、更快捷地对窗体进行…

科技赋能无人零售

科技赋能无人零售,使其具备以下独特优势: 1. 全天候无缝服务 :无人零售店依托科技,实现24小时不间断运营,不受人力限制,满足消费者随时购物需求,尤其惠及夜间工作者、夜猫子及急需购物者&…

Android --- 常见UI组件

TextView 文本视图 设置字体大小:android:textSize"20sp" 用sp 设置颜色:android:textColor"#00ffff" 设置倍距(行距):android:lineSpacingMultiplier"2" 设置具体行距:android:lineSpacingExtra&q…

基于RK3588的全国产鸿蒙边缘计算工控机在智能交通ETC收费系统的应用

1.1 产品简介 基于智能交通、工业互联等行业快速智能化发展的需求,以 OpenHarmony 为框架开发嵌入 HamonyOS,打造了具有高智能、高可靠、高安全的自主 可控的边缘处理器 XM-RK3588。 图 1-1 边缘处理器 HamonyOS强化 IoT 互联互动能力,让边缘…

Python爬虫入门指南--爬虫技术的由来、发展与未来--实战课程大赠送

爬虫,也称为网络爬虫或网络蜘蛛,是一种自动化程序,专门用于遍历互联网并收集数据。这种技术的起源、发展和未来都与互联网紧密相连,并在信息检索、数据挖掘等多个领域发挥着不可或缺的作用。 "免费IP池大放送!助…

堆的概念、堆的向下调整算法、堆的向上调整算法、堆的基本功能实现

目录 堆的介绍 堆的概念 堆的性质 堆的结构 堆的向下调整算法 基本思想(以建小堆为例) 代码 堆的向上调整算法 基本思想(以建小堆为例) 代码 堆功能的实现 堆的初始化 HeapInit 销毁堆 HeapDestroy 打印堆 HeapPrint …

洛谷 P1021 邮票面值设计

原题链接:[NOIP1999 提高组] 邮票面值设计 - 洛谷 目录 题目描述 解题思路: 代码实现: 题后总结: 题目描述 给定一个信封,最多只允许粘贴 N 张邮票,计算在给定 K(NK≤15)种邮票…

RAG的进化之路:从单兵作战到多智协作

原文:https://arxiv.org/pdf/2404.15155.pdf 近年来,随着大规模预训练语言模型的蓬勃发展,基于检索的知识问答技术越来越受到学术界和工业界的青睐。其中最具代表性的当属RAG方法。RAG通过将外部知识库集成到语言模型中,对输入的问题进行深入理解、推理,并生成相应的…

【C语言】联合体详解

目录 1.联合体的声明 2.联合体的特点 3.相同成员的结构体和联合体对比 4.联合体大小的计算 1.联合体的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间。 联合体的特点是所…

骑砍2霸主MOD开发(6)-使用C#-Harmony修改本体游戏逻辑

一.C#-Harmony反射及动态注入 利用C#运行时环境的反射原理,实现对已加载DLL,未加载DLL中代码替换和前置后置插桩. C#依赖库下载地址:霸王•吕布 / CSharpHarmonyLib GitCodehttps://gitcode.net/qq_35829452/csharpharmonylib 根据实际运行.Net环境选择对应版本的0Harmony.dll…

C++(Qt)软件调试---crashpad捕获崩溃(19)

C(Qt)软件调试—crashpad捕获崩溃(19) 文章目录 C(Qt)软件调试---crashpad捕获崩溃(19)1、概述2、资源地址3、配置环境4、解决报错5、测试代码6、测试结果7、Qt中使用crashpad 更多精彩内容👉个人内容分类汇总 &#x…

矩阵按列相乘运算的并行化实现方法

这两天一直在琢磨如下矩阵计算问题。 已知dm矩阵X和hq矩阵Y,求如下矩阵: 其中X(:,i), Y(:,j)分别表示矩阵X, Y的第i列和第j列,易知Z为dh矩阵。 如果直接串行计算矩阵Z,两个循环共有mq,则会很慢,能不能并行化…

枚举(enum)/共用体(union)/结构体(struct)---详解

前言 C语言包含内置类型和自定义类型。 其实C语言中有内置类型,包含:char,short,int,long,long long,float,double,long double ,这些是C语言本身支持的现成的类型。 但仅仅只有内置类型是远远不够的,在描述一个复杂对象是无法使用内置类型来…