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

news2024/11/15 21:38:26

目录

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.coloradmin.cn/o/1622097.html

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

相关文章

Java基础之JVM对象内存分配机制简介

一 对象内存分配 1.1 运行时数据区域 1.2 常见java应用启动JVM参数: -Xss:每个线程的栈大小(单位kb)-Xms:堆的初始大小,默认物理内存的1/64,示例:-Xms:4g -Xms:10m-Xmx:堆的最大可用大小,默认物…

vue cli3开发自己的插件发布到npm

具体流程如下: 1、创建一个vue项目 vue create project 2、编写组件 (1)新建一个plugins文件夹(可自行创建) (2)新建Button组件 (3)组件挂载,为组件提供 in…

Opencv | 边缘检测 轮廓信息

目录 一. 边缘检测1. 边缘的定义2. Sobel算子 边缘提取3. Scharr算子 边缘提取4. Laplacian算子 边缘提取5. Canny 边缘检测算法5.1 计算梯度的强度及方向5.2 非极大值抑制5.3 双阈值检测5.4 抑制孤立弱边缘 二. 轮廓信息1. 获取轮廓信息2. 画轮廓 一. 边缘检测 1. 边缘的定义…

css中新型的边框设置属性border-inline

一、概念与背景 border-inline 是 CSS Logical Properties and Values 模块中的一个属性,用于控制元素在流内(inline)方向上的边框。该模块旨在提供与书写模式(writing mode)无关的布局和样式描述方式,使得…

牛客NC216 逆波兰表达式求值【中等 栈 C++/Java/Go/PHP】

题目 题目链接:https://www.nowcoder.com/practice/885c1db3e39040cbae5cdf59fb0e9382 核心 栈 参考答案C class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** param tokens strin…

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…

Redis系列:内存淘汰策略

1 前言 通过前面的一些文章我们知道&#xff0c;Redis的各项能力是基于内存实现的&#xff0c;相对其他的持久化存储&#xff08;如MySQL、File等&#xff0c;数据持久化在磁盘上&#xff09;&#xff0c;性能会高很多&#xff0c;这也是高速缓存的一个优势。 但是问题来了&am…

论机器学习(ML)在网络安全中的重要性

机器学习是什么&#xff1f; 机器学习(ML)是人工智能的一个分支&#xff0c;它使用算法来使计算机系统能够自动地从数据和经验中进行学习&#xff0c;并改进其性能&#xff0c;而无需进行明确的编程。机器学习涉及对大量数据的分析&#xff0c;通过识别数据中的模式来做出预测…

Python | 获取PCD点云数据强度等信息

最近工作需要&#xff0c;需要获取PCD点云数据的强度等信息&#xff0c;给出open3d和pypcd两种方法获取强度信息。读取的PCD数据头格式如下&#xff1a; VERSION 0.7 FIELDS x y z intensity laserid timeoffset yawangle SIZE 4 4 4 1 2 8 4 TYPE F F F U U F F COUNT 1 1 1 …

Spring Boot | Spring Boot 实现 “Redis缓存管理“

目录 : Spring Boot 实现 "Redis缓存管理" :一、Spring Boot 支持的 "缓存组件" &#xff08; 如果 “没有” 明确指定使用自定义的 "cacheManager "或 "cacheResolver" &#xff0c;此时 SpringBoot会按照“预先定义的顺序” 启动一个…

浅谈本地缓存的几种方案选型

一、摘要 说到缓存&#xff0c;面试官基本上会绕不开以下几个话题&#xff01; 项目中哪些地方用到了缓存&#xff1f;为什么要使用缓存&#xff1f;怎么使用它的&#xff1f;引入缓存后会带来哪些问题&#xff1f; 这些问题&#xff0c;基本上是互联网公司面试时必问的一些…

STM32,复位和时钟控制

外部时钟 HSE 以后需要用到什么就这样直接拿去配就行了

【Linux网络】FTP服务

目录 一、FTP简介 1.FTP-文件传输协议 2.FTP的两种模式 二、安装配置FTP 1.安装环境 2.对文件的操作 3.切换目录 4.设置匿名用户 5.图形化界面登录 6.白名单与黑名单 重点与难点 一、FTP简介 1.FTP-文件传输协议 FTP是FileTransferProtocol&#xff08;文件传输协…

【C++干货基地】深度理解C++中的高效内存管理方式 new delete

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

【八股】Java基础、集合、JVM

面向对象三大特性 1 封装&#xff1a; 将 方法 和 属性 写到同一个类中&#xff0c;并将属性 私有化&#xff0c;生成 get set方法&#xff0c;外部访问属性需要通过get和set方法,内部可以直接访问属性&#xff0c;这样的一个类我们认为它完成了封装。 2 继承&#xff1a; 子…

【3GPP】【核心网】【LTE】S1MME流程字段分析(一)

1. 欢迎大家订阅和关注&#xff0c;精讲3GPP通信协议&#xff08;2G/3G/4G/5G/IMS&#xff09;知识点&#xff0c;专栏会持续更新中.....敬请期待&#xff01; 目录 1. Attach(23.401 5.3.2) 2. Service Request(23.401 5.3.4) 3. TAU (23.401 5.3.3) 3.1 Tracking Area Up…

《大话数据结构》12 图的相关算法

我有天早晨准备出门&#xff0c;发现钥匙不见了。昨晚还看到它&#xff0c;所以确定钥匙在家里。一定是我那三岁不到的儿子拿着玩&#xff0c;不知道丢到哪个犄角旮旯去了&#xff0c;问他也说不清楚。我现在必须得找到它&#xff0c;你们说&#xff0c;我应该如何找&#xff1…

华为OD机试 - 智能驾驶 - 广度优先搜索(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

「 网络安全常用术语解读 」什么是0day、1day、nday漏洞

1. 引言 漏洞攻击的时间窗口被称为漏洞窗口&#xff08;window of vulnerability&#xff09;。一般来说&#xff0c;漏洞窗口持续的时间越长&#xff0c;攻击者可以利用漏洞进行攻击的可能性就越大。 2. 0day 漏洞 0day 漏洞&#xff0c;又被称为"零日漏洞"&…

YUNBEE云贝-Oracle 19c OCM 5月19日

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 19c OCM考试类别&#xff1f; Oracle 19c OCM认证大师直考(2天考试&#xff0c;4个模块&#xff0c;每个模块3小时) Oracle 19c OCM认证大师升级考(1天考试&#xff0c;2个模块&#xff0c;每个模块3小时) 在…