当前位置: 首页 > article >正文

Java中常见的PO、VO、DAO、BO、DO、DTO、POJO、Query类解释(通俗易懂)

文章目录

  • 先点击收藏和点赞,切勿白嫖,感谢
  • 一丶PO(persistant object)持久对象
  • 二丶VO(value object)值对象
  • 三丶DAO(Data Access Objects) 数据访问对象接口
  • 四丶BO/DO(Business Object) 业务对象层
  • 五丶DTO(Data Transfer Object) 数据传输对象
  • 六丶POJO(Plain Old Java Objects) 简单的Java对象
  • 七丶Query 数据查询对象
  • 八丶常见问题
    • 业务图
    • 如何在项目中应用这些对象
    • VO可以复用吗?
    • Controller层接收的参数是VO还是DTO?
  • 九丶springboot案例
    • 1. UserPO 类
    • 2.UserDAO 接口
    • 3.UserBO 类
    • 4.UserService 类
    • 5.UserController 类

项目中常见很多Dto.VO类等,下边简单简介下各种解释,这种知识知道了解即可

先点击收藏和点赞,切勿白嫖,感谢

先点赞再观看,谢谢

一丶PO(persistant object)持久对象

与数据库中的表相映射的java对象

二丶VO(value object)值对象

用于表示一个与前端进行交互的视图对象,它的作用是把某个指定页面(或组件)的所有数据封装起来。实际上,这里的 VO 只包含前端需要展示的数据,对于前端不需要的数据,比如数据创建和修改的时间等字段,出于减少传输数据量大小和保护数据库结构不外泄的目的,不应该在 VO 中体现出来

三丶DAO(Data Access Objects) 数据访问对象接口

顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间

四丶BO/DO(Business Object) 业务对象层

业务对象,就是从现实世界中抽象出来的有形或无形的业务实体。

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

用于表示一个数据传输对象,DTO 通常用于展示层(Controller)和服务层(Service)之间的数据传输对象。DTO 与 VO 概念相似,并且通常情况下字段也基本一致。但 DTO 与 VO 又有一些不同,这个不同主要是设计理念上的,比如 API 服务需要使用的 DTO 就可能与 VO 存在差异

六丶POJO(Plain Old Java Objects) 简单的Java对象

实际就是普通JavaBeans,使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接.其中有一些属性及其getter、setter方法的类,有时可以作为value object或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法

七丶Query 数据查询对象

数据查询对象,各层接收上层的的查询请求.注意,查过2个参数的需要封装到query类中,禁止使用Map类

八丶常见问题

业务图

在这里插入图片描述

如何在项目中应用这些对象

在一个典型的Spring Boot 项目中,这些对象的应用场景如下:

  1. Controller 层:接收请求,使用 VO 对象将数据返回给前端。
  2. Service 层:处理业务逻辑,使用 BO 对象封装业务逻辑。
  3. Repository 层:访问数据库,使用 DAO 对象进行数据操作。
  4. DTO 对象:在不同层或服务之间传递数据,特别是在微服务中。
  5. PO 对象:用于 ORM映射,与数据库表结构一一对应。

VO可以复用吗?

比如,一个接口需要VO,另一个接口需要VO加上别的一些数据,这种情况,是继承VO使用,还是再写一个VO

答案:VO最好不要复用。VO目的就是解耦,应该是并列关系的,如果存在复用,那么就可能导致,一方修改影响另一方。一旦存在继承关系,继承来继承去,最后关系就会变得很乱,不好维护。

Controller层接收的参数是VO还是DTO?

希望大家根据公司情况来定,我们公司前端交互是统一VO的。

Controller层接收的应该是VO,但是根据情况而定,尤其是前后分离,有特定的前端开发人员时,因为DTO往往会添加很多额外的数据信息。

打个比方,用户新增,往往前端传递的是账户名、密码、创建人标识等等很少的信息,但是DTO作为一个中转数据,会添加例如更新人、用户状态等等其他的信息,如果前端传递的是DTO,如此多的额外信息会给前端造成很多问题。

如果是小项目的话,前后端都是一个人在进行,那就无所谓了,后端需要哪些,不需要哪些心里有数,传递DTO就无所谓了。

一般的数据传递是,前端传递VO给接口(Controller),接口将VO转为DTO传递给service,service将DTO分解为DO,调用领域服务进行调度,然后逆向转为VO或者其他的返回结果,传递给前台。

九丶springboot案例

1. UserPO 类

@Entity
@Table(name = "users")
public class UserPO {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(name = "username", nullable = false)private String username;@Column(name = "password", nullable = false)private String password;// Getters and Setters
}

2.UserDAO 接口

@Repository
public interface UserDAO extends JpaRepository<UserPO, Long> {UserPO findByUsername(String username);
}

3.UserBO 类

public class UserBO {private String username;private String encryptedPassword;// 业务逻辑public boolean isPasswordCorrect(String inputPassword) {return encryptedPassword.equals(encryptPassword(inputPassword));}private String encryptPassword(String password) {// 加密逻辑return password; // 这里为了简化,实际应返回加密后的密码}// Getters and Setters
}

4.UserService 类

@Service
public class UserService {@Autowiredprivate UserDAO userDAO;public UserBO getUserByUsername(String username) {UserPO userPO = userDAO.findByUsername(username);UserBO userBO = new UserBO();userBO.setUsername(userPO.getUsername());userBO.setEncryptedPassword(userPO.getPassword());return userBO;}
}

5.UserController 类

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/getUser")public UserVO getUser(@RequeryBody UserQuery query) {UserBO userBO = userService.getUserByUsername(query);UserVO userVO = new UserVO();userVO.setUsername(userBO.getUsername());return userVO;}
}

相关文章:

Java中常见的PO、VO、DAO、BO、DO、DTO、POJO、Query类解释(通俗易懂)

文章目录 先点击收藏和点赞,切勿白嫖,感谢一丶PO(persistant object)持久对象二丶VO(value object)值对象三丶DAO(Data Access Objects) 数据访问对象接口四丶BO/DO(Business Object) 业务对象层五丶DTO(Data Transfer Object) 数据传输对象六丶POJO(Plain Old Java Objects) 简…...

完美解决ElementUI中树形结构table勾选问题

完美解决ElementUI中树形结构table勾选问题 实现功能效果图全选取消全选取消父节点取消某个子节点 关键代码 实现功能 1. 全选/取消全选&#xff0c;更新所有节点勾选状态 2. 勾选父/子节点&#xff0c;子/父节点状态和全选框状态更新 效果图 全选 取消全选 取消父节点 取消某…...

laravel项目中使用FFMPeg 剪裁视频

# 运行环境需安装的软件 ffmpeg # 安装的扩展 pbmedia/laravel-ffmpeg: ^8.3 # 扩展文档 https://packagist.org/packages/pbmedia/laravel-ffmpeg # 引入的类 use FFMpeg\Coordinate\TimeCode; use FFMpeg\Format\Video\X264; use FFMpeg\Exception\RuntimeException; use …...

docker基本应用和相关指令

文章目录 概要镜像管理容器操作网络管理数据卷管理其他常用指令典型场景示例小结 概要 Docker的命令通常分为几个大类&#xff0c;比如镜像管理&#xff08;images&#xff09;、容器管理&#xff08;containers&#xff09;、网络&#xff08;network&#xff09;、数据卷&…...

文件解析漏洞靶场集锦详解

一、IIS解析漏洞 环境安装&#xff1a;windows2003iis6 1.目录解析 .asp文件夹中的任意文件都会被当做asp文件去执行 1.在iis6的网站根目录新建⼀个名为1.asp的文件 2. 在1.asp中新建⼀个jpg文件。内容为 <%now()%>asp代码 3.在外部浏览器中访问iis⽹站中的1.jpg 发现…...

基于Java + Redis + RocketMQ的库存秒杀系统设计与实现

一、秒杀场景核心挑战 瞬时高并发&#xff1a;万级QPS访问压力 库存准确性&#xff1a;避免超卖/少卖 系统可用性&#xff1a;防止雪崩效应 数据一致性&#xff1a;缓存与数据库同步 二、技术架构设计 1. 分层架构设计 用户请求│▼ 接入层&#xff08;Nginx限流 令牌拦…...

hcia华为路由器静态路由实验配置

目录 一、网络拓扑分析 二、华为路由器配置&#xff08;分设备&#xff09; 1. R1 配置 2. R2 配置 3. R3 配置 三、验证测试 拓扑图 一、网络拓扑分析 IP 地址规划&#xff1a; R1&#xff1a;E0/0/0&#xff08;12.1.1.1/24&#xff09;、E0/0/1&#xff08;192.168.1.…...

C语言【数据结构】:理解什么是数据结构和算法(启航)

引言 启航篇&#xff0c;理解什么是数据结构和算法 在 C 语言编程领域&#xff0c;数据结构和算法是两个核心且紧密相关的概念 一、数据结构 定义 数据结构是指相互之间存在一种或多种特定关系的数据元素的集合&#xff08;比如数组&#xff09;&#xff0c;它是组织和存储数…...

Redis7——进阶篇(五)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…...

手写svm primal form形式

svm.py import numpy as npclass SVM:def __init__(self,C1.0,lr0.01,batch_size32,epochs100):self.CCself.lrlrself.batch_sizebatch_sizeself.epochsepochsself.wNoneself.b0.0self.epoch0#计算最高得分和对应w&#xff0c;bdef fit(self,X,y,X_valNone,y_valNone):sample,…...

Linux中Firewall防火墙操作

一、安装Firewall命令 yum install firewalld firewalld-config二、防火墙的基本操作 1、查看防火墙状态 使用systemctl status firewalld命令可以查看firewalld服务的状态。也可以使用firewall-cmd --state命令直接查看防火墙的状态。 2、开启防火墙 * 临时性开启&…...

【MySQL】MySQL服务器——mysqld

1.MySQL服务器 是名为 mysqld 的数据库服务器程序&#xff0c;和“主机”&#xff08;host&#xff09;不一样是一个多线程的单进程管理对磁盘和内存中数据库的访问支持并发的客户端连接支持多个存储引擎&#xff0c;常见的存储引擎包括InnoDB、MyISAM、Memory、Archive支持事…...

VBA+FreePic2Pdf 找出没有放入PDF组合的单个PDF工艺文件

设计部门针对某个项目做了一个工艺汇总报告&#xff0c;原先只要几十个工艺文件&#xff0c;组合成一个PDF&#xff0c;但后来要求要多放点PDF进去&#xff0c;但工艺文件都混在一起又不知道哪些是重复的&#xff0c;找上我让我帮忙处理一下&#xff0c;我开始建议让她重新再组…...

windows 下用docker 部署nginx

简单版本记录&#xff0c;详细内容后续再写 一、拉取nginx镜像&#xff0c;运行 docker pull nginx 二、创建项目目录 C:\nginx-docker\ ├── html\ │ └── index.html └── conf | └── nginx.conf// index.html<!DOCTYPE html> <html> <head&g…...

云原生性能测试全解析:如何构建高效稳定的现代应用?

一、引言 随着云计算技术的快速发展&#xff0c;云原生&#xff08;Cloud Native&#xff09;架构成为现代应用开发的主流模式。云原生应用通常采用微服务架构、容器化部署&#xff0c;并利用 Kubernetes&#xff08;K8s&#xff09;等编排工具进行管理。然而&#xff0c;云原…...

计网面试准备

正确理解网络数据传输过程 同一路由器的不同接口属于不同局域网&#xff0c;广播只能在同一个局域网...

【数据分享】1999—2023年我国地级市社会消费品零售总额和年末金融机构存贷款余额(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2024年《中国城市统计年鉴》整理的1999-2023年地级市的人口相关数据、染物排放和环境治理相关数据和房地产投资情况和商品房销售面积相关指标数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次我们分享…...

鸿蒙开发者社区资源的重要性

鸿蒙系统&#xff0c;作为华为公司自主研发的操作系统&#xff0c;旨在为各类智能设备提供统一的平台。它不仅支持手机、平板电脑等移动设备&#xff0c;还涵盖了物联网&#xff08;IoT&#xff09;设备和其他智能家居产品。鸿蒙系统的开发环境和工具链对于开发者来说至关重要&…...

PHP批量去除Bom头的方法

检查的代码&#xff1a; <?php$dir __DIR__; $files new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));foreach ($files as $file) {if ($file->isFile() && pathinfo($file, PATHINFO_EXTENSION) php) {$content file_get_contents(…...

字节攻克关键技术,大模型训练效率提升1.7倍,成本节省40%

近日&#xff0c;字节豆包大模型团队开源针对 MoE 架构的关键优化技术COMET&#xff0c;该技术可将大模型训练效率提升1.7倍&#xff0c;成本节省40%。据悉&#xff0c;该技术已实际应用于字节的万卡集群训练&#xff0c;累计帮助节省了数百万 GPU 小时训练算力。 MoE&#xff…...

react对比vue的核心属性

Vue 常用的核心属性可以分为以下几类&#xff0c;并与 React 实现方式对比&#xff1a; 1. 核心属性 // Vue 选项式 API 常用属性 export default {props: {}, // 类似 React 的 propsdata() { return {} }, // 类似 React 的 useStatecomputed: {}, // 类似 React …...

[Pytorch报错问题解决]AttributeError: ‘nn.Sequential‘ object has no attribute ‘append‘

问题 运行深度学习代码的时候遇到了以下报错问题&#xff1a; Traceback (most recent call last):File "/home/anaconda3/envs/Text2HOI/lib/python3.9/site-packages/torch/autograd/grad_mode.py", line 28, in decorate_contextreturn func(*args, **kwargs)Fi…...

golang字符串常用的系统函数

1.说明 字符串在开发中&#xff0c;使用频率非常高&#xff0c;所以我们需要掌握字符串的常用方法。 2.统计字符串的长度 按字节len&#xff08;str&#xff09;go的编码统一为utf-8&#xff08;ascii的字符 字母和数字占一个字节&#xff0c;汉字占三个字节&#xff09; st…...

基于威胁的安全测试值得关注,RASP将大放异彩

2‍021年7月21日&#xff0c;由中国信息通信研究院&#xff08;CAICT&#xff09;指导、悬镜安全主办、腾讯安全协办的中国首届DevSecOps敏捷安全大会&#xff08;DSO 2021&#xff09;在北京圆满举办。大会以“安全从供应链开始”为主题&#xff0c;寓意安全基础决定“上层建筑…...

FFmpeg —— 各系统下ffmpeg硬件加速和API支持情况(文内表格形式详细阐述)

介绍 FFmpeg 作为一款功能强大的多媒体处理工具,支持多种硬件加速技术,能够显著提升视频编解码的效率,尤其是在处理高分辨率、高码率视频时表现尤为突出。不同操作系统下,FFmpeg 的硬件加速实现方式和支持的 API 各有特点。 在 Windows 系统上,FFmpeg 主要依赖 DirectX Vi…...

前端及后端实现csv文件下载功能

方法一、 前端内容&#xff1a; const url window.URL.createObjectURL(new Blob([res.data])); const link document.createElement(a); link.href url; const fileNameDateTime getFormattedDateTime(); const filename "用户提现列表"fileNameDateTime.csv…...

AGI大模型(2):GPT:Generative Pre-trained Transformer

1 Generative Pre-trained Transformer 1.1 Generative生成式 GPT中的“生成式”指的是该模型能够根据输入自动生成文本内容&#xff0c;而不仅仅是从已有的文本库中检索答案。 具体来说&#xff1a; 生成&#xff08;Generative&#xff09;&#xff1a;GPT是一个生成…...

DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14_06带搜索功能的固定表头表格

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…...

MySQL再次基础 向初级工程师迈进

作者&#xff1a;在计算机行业找不到工作的大四失业者 Run run run ! ! ! 1、MySQL概述 1.1数据库相关概念 1.2MySQL数据库 2、SQL 2.1SQL通用语法 SQL语句可以单行或多行书写&#xff0c;以分号结尾。SQL语句可以使用空格/缩进来增强语句的可读性。MySQL数据库的SQL语句不区…...

使用 Doris 和 Hudi

作为一种全新的开放式的数据管理架构&#xff0c;湖仓一体&#xff08;Data Lakehouse&#xff09;融合了数据仓库的高性能、实时性以及数据湖的低成本、灵活性等优势&#xff0c;帮助用户更加便捷地满足各种数据处理分析的需求&#xff0c;在企业的大数据体系中已经得到越来越…...