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;}
}

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

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

相关文章

Websocket的基本使用

1. WebSocket WebSocket 是一种在单个TCP连接上进行全双工通信的协议&#xff0c;它在现代 Web 开发和网络应用中发挥着重要作用。在 WebSocket 出现之前&#xff0c;实现服务器与客户端实时通信主要采用轮询Polling和长轮询Long - Polling等技术。轮询是客户端定时向服务器发…

MySQL安装及基础操作

以下是基于MySQL 8.4.3版本&#xff08;在Win11上&#xff09;的安装&#xff1a; 1.mysql的获取 官网&#xff1a;www.mysql.com 也可以从Oracle官方进入&#xff1a;https://www.oracle.com/ 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 两者…

基于6自由度搬运机器人完成单关节伺服控制实现的详细步骤及示例代码

以下是基于6自由度搬运机器人完成单关节伺服控制实现的详细步骤及示例代码&#xff1a; 1. 系统概述 单关节伺服控制是指对机器人的单个关节进行精确的位置、速度或力矩控制。在6自由度搬运机器人中&#xff0c;每个关节通常由伺服电机驱动&#xff0c;通过反馈传感器&#x…

虚拟机新挂载磁盘后磁盘无法使用ssh问题 Permission denied (publickey).

在给vmware虚拟机挂载磁盘后再新磁盘目录里面使用ssh拉取代码一直报错: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. manifests: 虚拟机可以添加硬盘,…

每天五分钟深度学习框架PyTorch:ResNet算法模型完成CAFIR十分类

本文重点 ResNet模型已经搭建完成了&#xff0c;本文我们使用ResNet来跑一下CAFIR10的数据集&#xff0c;看一下分类效果如何&#xff1f; 代码 本文总结 在之前的课程中我们对残差块以及ResNet模型进行了详细的介绍&#xff0c;并且我们对模型训练这些基础的数据集进行了详…

Python网络爬虫与数据采集实战——网络爬虫的基本流程

网络爬虫&#xff08;Web Scraper&#xff09;是用于自动化地从互联网上抓取信息的程序。它广泛应用于搜索引擎、数据采集、市场分析等领域。本文将详细探讨网络爬虫的基本流程&#xff0c;包括URL提取、HTTP请求与响应、数据解析与存储&#xff0c;以及一个实际的爬虫示例。文…

1.3 双指针专题:快乐数(medium)

1.题目链接 202. 快乐数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/happy-number/submissions/609206400/ 2.题目描述 编写⼀个算法来判断⼀个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于⼀个正整数&#xff0c;每⼀次将该数替换…

系统结构知识点

1.主存和辅存以页面交换数据 2.计算机系统硬件固体软件 3.计算机系统结构概念的实质是确定计算机系统中软&#xff0c;硬件的界面&#xff0c;界面之上是软件实现的功能&#xff0c;界面之下是硬件和固体实现的功能 4.计算机组成是指计算机系统结构的逻辑实现。计算机实现是…

STM32 HAL库 CAN过滤器配置

之前在STM32 f407 CAN收发 基于HAL库和Cubemx配置_stm32f407can收发程序-CSDN博客这篇博文里写了一下配置CAN收发的方法&#xff0c;当时由于并没有使用过滤器的现实需求&#xff0c;所以就也没仔细研究。现在工作中确实需要用到过滤器了&#xff0c;有些项目中控制器和发动机E…

飞搭系列|数据迁移功能全新升级,助力用户实现高效无缝迁移!

前言 飞搭低代码平台&#xff08;FeiDa&#xff0c;以下简称“飞搭”&#xff09;&#xff0c;为企业提供在线化、灵活的业务应用构建工具&#xff0c;支持高低代码融合&#xff0c;助力企业低门槛、高效率和低成本地快速应对市场变化&#xff0c;加速复杂业务场景落地。 在之…

【后端】【ubuntu】 ubuntu目录权限查看的几种方法

在Ubuntu中&#xff0c;有多种方式可以查看目录或文件的权限&#xff0c;以下为你详细介绍常见的指令及其使用方法&#xff1a; 1. ls -l 命令 这是最常用的查看文件和目录权限的命令&#xff0c;-l 选项用于以长格式列出文件和目录的详细信息&#xff0c;其中就包含权限信息…

深度学习与大模型基础-向量

大家好&#xff01;今天我们来聊聊向量&#xff08;Vector&#xff09;。别被这个词吓到&#xff0c;其实向量在我们的生活中无处不在&#xff0c;只是我们没注意罢了。 1. 向量是什么&#xff1f; 简单来说&#xff0c;向量就是有大小和方向的量。比如你从家走到学校&#x…

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…

用Python和Docker-py打造高效容器化应用管理利器

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着容器化技术的发展,Docker已成为现代化应用部署的核心工具。然而,手动管理容器在规模化场景下效率低下。本文深入探讨如何利用Python结…

【RabbitMQ】事务

事务的简单配置及使用 配置事务管理器声明队列生产者代码测试 RabbitMQ是基于AMQP协议实现的&#xff0c;该协议实现了事务机制&#xff0c;因此RabbitMQ也支持事务机制. SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的&#xff0c…

在 IntelliJ IDEA 中配置 Git

1. 确保已安装 Git 在配置之前&#xff0c;确保你的系统已经安装了 Git。 检查是否已安装 Git&#xff1a; bash 复制 git --version 如果未安装&#xff0c;请前往 Git 官网 下载并安装。 2. 在 IntelliJ IDEA 中配置 Git 打开 IntelliJ IDEA。 进入设置&#xff1a; Windo…

【A2DP】蓝牙A2DP协议剖析:从架构到规范

目录 一、A2DP 协议架构 1.1 A2DP 协议栈结构组成 1.2 协议栈各部分的关系与作用 二、设备配置与角色定义&#xff08;Configurations and roles &#xff09; 2.1 角色定义 2.2 配置示例与角色体现 三、用户需求与场景 3.1 用户需求与场景 3.2 协议限制 3.3 协议要求…

【从零开始学习计算机科学】操作系统(五)处理器调度

【从零开始学习计算机科学】操作系统(五)处理器调度 处理器调度一些简单的短程调度算法的思路先来先服务(First-Come-First-Served,FCFS)优先级调度及其变种最短作业优先调度算法(SJF)--非抢占式最短作业优先调度算法(SJF)--抢占式最高响应比优先调度算法轮转调度算法…

27. Harmonyos Next仿uv-ui 组件NumberBox 步进器组件禁用状态

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 1. 组件介绍2. 效果展示3. 禁用状态设置3.1 整体禁用3.2 输入框禁用3.3 长按禁用 4. 完整示例代码5. 知识点讲解5.1 禁用状态属性5.2 禁用…

Shardingsphere-jdbc 自定义脱敏规则

添加邮件脱敏规则&#xff1a; // 123123123qq.com&#xff0c;将前4个字符脱敏 12312****qq.com 代码重写MaskAlgorithm相关方法&#xff1a; /** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE…