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.mfbz.cn/a/569979.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

edu邮箱官方购买渠道手把手选购指南记录

教育优惠,是一项针对于在校大学生和教职员工推出的特殊优惠活动。一些公司会将旗下产品或服务以一定的折扣,甚至免费提供给高校师生。想想自己上大学的时候啥都不知道,毕业后才发现浪费了这么多优秀的资源.如果你还是一名在校大学生,那么就不…

40. 【Android教程】AsyncTask:异步任务

在前面的章节有提到过,Android 系统默认会在主线程(UI 线程)执行任务,但是如果有耗时程序就会阻塞 UI 线程,导致页面卡顿。这时候我们通常会将耗时任务放在独立的线程,然后通过 Handler 等线程间通信机制完…

扁平与圆形Cat6网线:区别与选择指南

🌵在构建家庭或办公室网络时,选择合适的网线类型至关重要。Cat6网线因其高速传输性能而广受欢迎,但在购买时,您可能会发现市场上有两种不同形状的Cat6网线:扁平和圆形。本文将探讨这两种网线的区别,并提供选…

用html写一个旋转菜单

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>旋转菜单</title><link relstylesheet href"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css"&…

百兆集成网络链接器911105A

百兆集成网络链接器&#xff08;有时也称为百兆网卡&#xff09;是一种硬件设备&#xff0c;主要用于计算机与计算机网络之间的高速数据传输。它的主要功能包括&#xff1a; 1. 高速数据传输&#xff1a;百兆集成网络链接器支持100Mbps的数据传输速率&#xff0c;比之前的以太…

河道采砂执法监管信息化平台:科技赋能,智慧监管

随着信息技术的飞速发展&#xff0c;信息化平台已经成为提升行业监管效率和水平的重要工具。河道采砂作为水利资源管理的重要环节&#xff0c;其执法监管同样需要与时俱进&#xff0c;利用先进技术手段提升监管效能。河道采砂执法监管信息化平台便是这一背景下的产物&#xff0…

某酒业集团数字化转型规划(169页附下载)

某酒业集团数字化转型项目实施方案建议书(P169).rar是一个极具参考价值的资料&#xff0c;它详细地阐述了如何利用数字化技术来推动企业转型。这份建议书以IBM的先进技术和某酒业集团的实际应用需求为基础&#xff0c;提出了一套全面、系统的数字化转型解决方案。该方案首先对某…

在linux系统打开pycharm,为pycharm在桌面设置图标

1.打开终端输入&#xff1a;gedit /usr/share/applications/Pycharm.desktop 然后会弹出一个文件 2.在文件中写入&#xff1a; [Desktop Entry] TypeApplication NamePycharm GenericNamePycharm3 CommentPycharm3:The Python IDE Execsh /home/.../pycharm.sh #自己pych…

【kettle002】kettle访问人大金仓KingbaseES数据库并处理数据至execl文件

一直以来想写下基于kettle的系列文章&#xff0c;作为较火的数据ETL工具&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 熟悉、梳理、总结下人大金仓KingbaseES数据库相关知识体系 kettle访问人大金仓KingbaseES数据库…

Centos之yum安装好玩的命令

1.会动的小火车 我在root下使用的 yum install sl.x86_64sl2.figlet yum install figlet.x86_64figlet 55553.cowsay会说话 yum install cowsay

javaScript基础3

javaScript 一.对象1.概念2.创建对象的三种方法(1).字面量创建&#xff08;利用{}&#xff09;(2)变量、属性、函数、方法的区别(3).new Object创建(4).构造函数 3.new关键字的执行过程4.遍历对象&#xff08;for..in) 二.内置对象1.了解2.math对象3.日期对象&#xff08;构造函…

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡

【声呐仿真】学习记录0.5-配置ssh远程连接docker、在docker中使用nvidia显卡 配置ssh远程连接docker1.端口映射2.配置ssh 在docker中使用nvidia显卡配置CUDA 注意&#xff1a;之前已经创建过容器的&#xff0c;需要打包成镜像&#xff0c;重新创建容器&#xff0c;因为要在创建…

伐木机不要石头!!!

伐木机不要石头&#xff01;&#xff01;&#xff01;(easy version) 本题有对应的hard version&#xff0c;区别仅在多次询问中。保证easy version的测试用例集是hard version的真子集&#xff0c;通过困难版本的代码经过简单修改可直接通过简单版 看着家里贫瘠的资源&#x…

【Python学习】面向对象

面向对象 1.初识对象1.1 生活中数据的组织1. 2 程序中数据的组织1.3 使用对象组织数据1.4进行对比 2. 成员方法2.1 类的定义和使用2.2 成员变量和成员方法2.2.1 成员变量2.2.2 成员方法的定义语法2.2.3 self 的作用 3. 类和对象3.1 面向过程3.2 面向对象 4.构造方法4.1 属性成员…

用Vue做一个待办事项

这个待办事项有以下功能&#xff1a;增删查&#xff0c;既新增待办事项&#xff0c;删除待办事项&#xff0c;查看全部&#xff0c;未完成&#xff0c;完成待办事项&#xff0c;当鼠标移动到待办事项上时会显示删除按钮 分为四个部分来实现&#xff1a;ToDoHeader.vue、ToDoMai…

XYCTF 部分wp及学习记录

1.ezmd5 根据题目提示 我们知道应该是要上传两张md5值相同的图片 根据原文链接&#xff1a;cryptanalysis - Are there two known strings which have the same MD5 hash value? - Cryptography Stack Exchange 把保存下来的图片上传一下 得到flag 2.ezhttp 根据原文链接&…

多臂老虎机介绍【Multi-armed Bandits】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…

Python基础05-数学运算与排列组合生成

在Python中进行数学运算和生成排列组合是数据科学、机器学习和日常编程中常见的任务。本文将介绍如何在Python中执行基本的数学运算、处理复数、使用数学函数、生成排列和组合、随机数生成、处理分数、统计函数以及处理无穷大和NaN值。 1. 基本算术运算 Python支持传统的四则…

26版SPSS操作教程(高级教程第十三章)

前言 #今日世界读书日&#xff0c;宝子你&#xff0c;读书了嘛~ #本期内容&#xff1a;主成分分析、因子分析、多维偏好分析 #由于导师最近布置了学习SPSS这款软件的任务&#xff0c;因此想来平台和大家一起交流下学习经验&#xff0c;这期推送内容接上一次高级教程第十二章…

【剪映专业版】05文字重叠

【剪映专业版】05文字重叠 1.在素材库中搜索纯黑背景&#xff0c;添加文本&#xff0c;设置合适的字体、字号等&#xff0c;导出备用。 2.返回窗口&#xff0c;设置字体颜色为纯黑&#xff0c;勾选描边设置描边为纯白&#xff0c;描边粗细值为8。导出备用。 3.将视频素材导入。…