DO、DTO、BO、VO、PO、DAO、POJO

目录

一、DO、DTO、BO、VO、PO、DAO、POJO的概念

二、DO、DTO、BO、VO具体如何使用?代码详细说明

三、有没有其他类似的概念,比如POJO(Plain Old Java Object)?它们有什么区别?

四、在实际项目中,何时应该使用DO、BO、DTO和VO?

五、你能举例说明一个具体的场景,需要用到DO、BO、DTO和VO吗?

六、如何在Java中实现DO、BO、DTO和VO?

七、你是否知道Spring框架中的Model对象,它是DO、BO、DTO还是VO?

八、你了解Spring MVC的基本工作流程吗?★★★


请阅读:关于PO、BO、VO、DTO、DAO、POJO等概念的理解_二木成林-华为云开发者联盟 (csdn.net)

一、DO、DTO、BO、VO、PO、DAO、POJO的概念

DO(Domain Object)领域对象,它代表的是业务领域的核心概念,通常包含了业务逻辑。在不同的上下文中,DO的含义可能会有所不同:

  1. 阿里巴巴开发手册中定义的DO类似于PO,与数据库表结构一一对应。
  2. 领域驱动设计(DDD)中,DO是业务对象,包含了业务规则和操作。

DTO(Data Transfer Object)数据传输对象,主要用于不同系统或者系统内部模块间的数据交换,可能不包含业务逻辑,仅保留必要的数据字段。

BO(Business Object)业务对象,它封装了一定的业务逻辑,可能涉及对DAO的调用,用于实现对数据的处理和服务。

VO(Value Object)值对象,主要用于表示页面展示的数据,往往是从其他对象(如BO或DTO)中提取出前端需要的部分,减少了数据传输量。

PO(Persistant Object)持久对象,直接映射数据库表的记录,常用于ORM框架,一般只有getter和setter方法,不含业务逻辑。

DAO(Data Access Object)数据访问对象,是对数据库操作的封装,提供了 CURD(Create, Read, Update, Delete)等基础方法,隔离了业务逻辑层与数据库访问层。

POJO(Plain Ordinary Java Object)简单无规则Java对象,它只是一个普通的Java类,遵循JavaBean规范,不附加特定框架或设计模式的要求,常作为数据容器使用。

-----------------------------------------------------------------------------

DO(Data Object):通常与数据库表结构对应,用于DAO层向上层传输数据源对象。

DTO(Data Transfer Object):数据传输对象,用于不同层之间,如Service到Controller,或是跨服务通信的数据载体。

BO(Business Object):业务对象,封装了具体的业务逻辑,主要在Service层内使用。

VO(View Object):视图对象,用于表示前端展示所需的数据,通常在Controller返回给视图时转换成VO格式。

这些对象的主要区别在于它们的用途和范围:

  • DO关注数据持久化,直接来源于或保存到数据库。
  • DTO关注数据传输,用于跨层或跨系统通信,可能包含多个来源的数据。
  • BO关注业务逻辑,是一个业务过程中的核心对象。
  • VO关注视图呈现,仅包含前端展示需要的信息。

-----------------------------------------------------------------------------

二、DO、DTO、BO、VO具体如何使用?代码详细说明

由于编写完整的代码示例在这里不太实际,我会提供一个概念性的概述以及它们在Java Spring框架中的简单应用场景。

假设我们有一个简单的User实体类,它与数据库中的用户表相对应(DO):

public class UserDO {private Long id;private String name;private String email;// getters and setters
}

现在,当我们从数据库中获取用户信息并将其传递给Service层时,可能会创建一个UserBO(BO),在此基础上添加业务逻辑:

public class UserBO {private UserDO userDO;public UserBO(UserDO user) {this.userDO = user;}public boolean isEmailVerified() {return !userDO.getEmail().contains("unverified");}// getters for user properties (if needed)
}

然后,在Service层向Controller层传递数据时,我们会创建一个UserDTO(DTO),因为可能不需要所有原始字段,并且可能需要进行一些转换:

public class UserDTO {private Long id;private String displayName;public UserDTO(UserBO userBO) {this.id = userBO.getUserDO().getId();this.displayName = userBO.getUserDO().getName();}
}

最后,当Controller将数据发送到视图(例如JSP页面)时,可以创建一个UserVO(VO)来适应视图的需求:

public class UserVO {private String usernameLabel;private String emailStatus;public UserVO(UserDTO userDTO) {this.usernameLabel = "Username: " + userDTO.getDisplayName();this.emailStatus = userDTO.isEmailVerified() ? "Verified" : "Unverified";}
}

应用这些对象的一个例子可能是:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;public UserDTO getUserDetails(Long userId) {UserDO userDO = userRepository.findById(userId).orElse(null);UserBO userBO = new UserBO(userDO);UserDTO userDTO = new UserDTO(userBO);return userDTO;}
}@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public ResponseEntity<UserVO> getUser(@PathVariable Long id) {UserDTO userDTO = userService.getUserDetails(id);UserVO userVO = new UserVO(userDTO);return ResponseEntity.ok(userVO);}
}

-----------------------------------------------------------------------------

三、有没有其他类似的概念,比如POJO(Plain Old Java Object)?它们有什么区别?

POJO(Plain Old Java Object)是一个没有特定限制或约束的普通Java对象。它通常用于存储和传输数据,而不包含任何特殊的框架API或者继承自特定的父类。POJO的主要特点就是它的简单性,它可以是任何不涉及特定技术或框架的Java类。

与上述提到的DO、DTO、BO和VO相比,主要区别在于它们的用途和上下文:

  • DO(Data Object)通常直接映射到数据库表,用于持久化操作。
  • DTO(Data Transfer Object)用于在系统组件之间传输数据,避免暴露内部实现细节。
  • BO(Business Object)代表业务逻辑的抽象,它封装了业务规则和操作。
  • VO(Value Object)主要用于表示视图的数据显示,往往与UI展示有关。

-----------------------------------------------------------------------------

四、在实际项目中,何时应该使用DO、BO、DTO和VO?

在实际项目中,根据不同的需求和场景,可以适当地使用DO、BO、DTO和VO:

  1. 当需要与数据库交互时,创建DO(Data Object)来映射数据库表,方便ORM(Object-Relational Mapping)框架如Hibernate进行数据持久化操作。

  2. 对于业务逻辑处理,定义BO(Business Object),它封装了与业务相关的操作和状态,例如订单服务可能有一个OrderBO,包含了创建订单、支付订单等方法。

  3. 在不同服务间通信或前端展示时,使用DTO(Data Transfer Object)。这是因为直接暴露DO可能会泄露过多的底层结构,而DTO只包含必要的属性,减少了不必要的复杂性。例如,在微服务架构中,服务A调用服务B,服务B会将数据转换为DTO返回给服务A。

  4. 对于视图展示,创建VO(View Object),它根据页面的需求定制数据结构,往往包含一些组合字段或处理过的数据。这样可以避免在视图层做复杂的业务逻辑计算。

-----------------------------------------------------------------------------

五、你能举例说明一个具体的场景,需要用到DO、BO、DTO和VO吗?

假设我们正在开发一个电商系统,这个系统有四个主要部分:数据库、业务逻辑、API接口和服务端渲染的前端页面。

  1. 数据库:我们需要存储商品信息,因此创建一个ProductDO类,其属性与数据库表字段一一对应,如idnamedescriptionprice等。

  2. 业务逻辑:当用户下单时,我们创建一个OrderBO,它不仅包含ProductDO的基本信息,还包含订单的状态(待付款、已发货等)、用户信息、收货地址等。OrderBO提供了方法来执行业务操作,如计算折扣、更新订单状态等。

  3. API接口:当用户通过API请求订单详情时,我们不需要暴露所有的内部业务信息,而是将OrderBO的数据转化为OrderDTO,只包含必要信息,如商品名称、价格、数量、总价等。这样可以保护系统的安全性和设计的清晰性。

  4. 前端页面:最后,服务器根据OrderDTO创建一个OrderVO,可能需要进一步调整数据结构以适应前端页面的展示,比如合并某些信息,或者添加一些计算后的属性,如优惠后的实际支付金额。

-----------------------------------------------------------------------------

六、如何在Java中实现DO、BO、DTO和VO?

在Java中实现DO、BO、DTO和VO主要是通过创建对应的Java类并定义其属性和行为。下面以一个简单的例子来说明:

假设我们有一个用户注册的场景,涉及到数据库、业务逻辑和API接口。

  1. Data Object (DO):
public class UserDO {private String id;private String username;private String password;private String email;// getters and setters
}
  1. Business Object (BO):
public class UserBO extends UserDO {private boolean isEmailVerified;public void verifyEmail() {// 更新isEmailVerified逻辑}// additional business logic methods// getters and setters for isEmailVerified
}
  1. Data Transfer Object (DTO):
public class UserDTO {private String username;private String email;// no sensitive data like passwords// getters and setters
}
  1. View Object (VO):
public class UserVO {private String displayName;private String formattedEmail;public UserVO(UserDTO userDto) {this.displayName = userDto.getUsername();this.formattedEmail = "mailto:" + userDto.getEmail();}// getters only, no setters as it's a read-only object for presentation
}

在这个例子中,UserDO直接映射数据库表;UserBO包含了业务逻辑,例如邮件验证;UserDTO用于API响应,不包含敏感信息;UserVO用于前端显示,格式化了邮箱地址。

-----------------------------------------------------------------------------

七、你是否知道Spring框架中的Model对象,它是DO、BO、DTO还是VO?

在Spring MVC框架中,Model对象是一个接口,通常用来存储视图相关的数据。它不是DO、BO、DTO或VO的一种,但可以包含这些类型的对象。Model对象通常用于控制器方法的参数,以便将数据传递给视图层。当你从控制器方法返回一个模型视图名称时,Spring会自动将Model中包含的所有对象暴露给视图。

例如:

@Controller
public class MyController {@GetMapping("/users")public String getUsers(Model model) {List<UserDTO> users = userService.getAllUsers();model.addAttribute("users", users);return "users";}
}

在这个例子中,UserDTO是DTO,而Model是用来在控制器和视图之间传递UserDTO的对象。

-----------------------------------------------------------------------------

八、你了解Spring MVC的基本工作流程吗?★★★

当然,Spring MVC的工作流程大致如下:

  1. 用户发送请求到达前端控制器(DispatcherServlet)。
  2. DispatcherServlet解析请求,并找到对应的处理器映射器(HandlerMapping)。
  3. 处理器映射器找到处理该请求的处理器(一般为一个Controller类的方法)。
  4. DispatcherServlet调用处理器适配器(HandlerAdapter)来执行处理器。
  5. 处理器执行完成后,返回一个ModelAndView对象,其中包含视图名和模型数据。
  6. 视图解析器(ViewResolver)根据ModelAndView中的视图名解析出具体的视图对象。
  7. DispatcherServlet将模型数据传给视图对象,视图开始渲染。
  8. 渲染完成后的结果被返回给客户端。

-----------------------------------------------------------------------------

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

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

相关文章

[lesson05]引用的本质分析

引用的本质分析 引用的意义 引用作为变量别名而存在&#xff0c;因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注意&#xff1a; 函数中的引用形参不需要进行初始化&#xff01;&#xff01; 特殊的引用 const引用 在C中可以声明const引用 cons…

可能是最便宜的姿态传感器,国产三轴加速度计SC7A20

可能是最便宜的姿态传感器 三轴检测 批量参考价格&#xff1a;整盘单价&#xff1a;1.242&#xff0c;一个包装10K&#xff0c;希望厂家能出点数量少的包装&#xff0c;这一盘太多了&#xff1a;&#xff09; 特点 宽电压范围 1.71V-3.6V 1.8V 兼容数字 IO 口 低功耗模式下…

若依项目名、包名修改器

Updater.java import java.io.File; import java.util.*;public class Updater {public static void main(String[] args) {String projectPath"D:\\workspace\\idea\\RuoYi-Cloud-Plus-2.X";updateNames(new File(projectPath));}//需要改名的目录名称&#xff08;…

GNURadio 软件在windows环境下安装

一、软件下载 网址&#xff1a;InstallingGR - GNU Radio 我已经下载的软件安装包&#xff0c;radioconda-2024.01.26-Windows-x86_64.rar 网址&#xff1a;https://download.csdn.net/download/weixin_37728585/89082238 二、安装过程 所有用户均可以使用。 选择安装路径&a…

一文彻底搞清 Iterator(遍历器)概念及用法

目录 一、由来及意义 二、具体实现流程 三、具有默认 Iterator 接口的数据结构 四、调用 Iterator 接口的场合 五、总结 一、由来及意义 Javascript中表示“集合”的数据结构&#xff0c;主要是 Array、Object、Map、Set 这四种数据集合&#xff0c;除此之外&#xff0c;…

每日一题 --- 删除字符串中的所有相邻重复项[力扣][Go]

删除字符串中的所有相邻重复项 题目&#xff1a;1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 在完成所…

JVM基础二——类的生命周期

加载阶段 &#xff1a; 连接阶段&#xff1a; 初始化阶段&#xff1a; 总结&#xff1a;

【Linux】SSH协议应用

SSH协议 SSH简介实现OpenSSH ssh中的四个文件~/.ssh文件路径实验解析 SSH 简介 SSH&#xff08;secure shell&#xff09;只是一种协议&#xff0c;存在多种实现&#xff0c;既有商业实现&#xff0c;也有开源实现。本文针对的实现是OpenSSH&#xff0c;它是自由软件&#xf…

React三大组件--ref

1.定义&#xff1a;组件内的标签可以定义ref属性来标识自己。 2.使用ref的三种方法 字符串形式的ref &#xff08;这个写法会慢慢替换掉&#xff0c;所以尽量不要写字符串形式&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta cha…

第18讲:数据在内存中的存储

⽬录 1. 整数在内存中的存储 2. ⼤⼩端字节序和字节序判断 3. 浮点数在内存中的存储 ——————————————————————————————————————————— 1. 整数在内存中的存储 在讲解操作符的时候&#xff0c;我们就讲过了下⾯的内容&#x…

力扣热题100_链表_21_合并两个有序链表

文章目录 题目链接解题思路解题代码 题目链接 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例…

jupyter Notebook 默认路径修改

1. anaconda prompt 中运行 jupyter notebook --generate-config 命令&#xff0c;将在 C:\Users\Think\.jupyter文件下生成 jupyter_notebook_config.py 文件。 2.在jupyter_notebook_config.py 文件中&#xff0c;找c.NotebookApp.notebook_dir 这个变量&#xff0c; (1)若…

Solana 线下活动回顾|多方创新实践,引领 Solana“文艺复兴”新浪潮

Solana 作为在过去一年里实现突破式飞跃的头部公链&#xff0c;究竟是如何与 Web3 行业共振&#xff0c;带来全新的技术发展与生态亮点的呢&#xff1f;在 3 月 24 日刚结束的「TinTin Destination Moon」活动现场&#xff0c;来自 Solana 生态的的专家大咖和 Web3 行业的资深人…

Java生产者消费者模式(等待唤醒机制)

1.生产者消费者模式 生产者消费者模式是一个十分经典的多线程协作的模式&#xff0c;主要用于解决多线程间的同步问题。它描述了两个类之间的协作&#xff1a;生产者和消费者。生产者负责生成数据&#xff08;或称为“产品”&#xff09;&#xff0c;而消费者负责消费这些数据…

LeetCode - 移除石子使总数最小

1962. 移除石子使总数最小 当我看到这道题目的时候&#xff0c;第一时间想到的是&#xff1a;while循环 sort&#xff0c;时间复杂度 k*nlogn。题目要求执行k次操作后&#xff0c;剩下狮子的最小总数&#xff0c;我们是否可以考虑维护一个堆呢&#xff1f;堆顶值最大&#xff…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《台风灾害下考虑多类型故障不确定性的源网荷协同弹性提升模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Leetcode_2两数相加

文章目录 前言一、两数相加1.1 问题描述1.2 解法一&#xff1a;分别将链表转为数字&#xff0c;然后相加1.3 代码实现1.4 解法二&#xff1a;分别将对应位置数字相加1.5 代码实现 二、使用步骤1.引入库2.读入数据 前言 链表是一种物理内存非连续存储&#xff0c;非顺序的线性数…

AI论文速读 |【综述】 时序分析基础模型:教程与综述

论文标题&#xff1a;Foundation Models for Time Series Analysis: A Tutorial and Survey 作者&#xff1a; Yuxuan Liang&#xff08;梁宇轩&#xff09;, Haomin Wen&#xff08;温浩珉&#xff09;, Yuqi Nie&#xff08;PatchTST一作&#xff09;, Yushan Jiang, Ming J…

windows安装Openssl

openssl官网:[ Downloads ] - /source/index.html Windows 安装方法 OpenSSL 官网没有提供 Windows 版本的安装包&#xff0c;可以选择其他开源平台提供的工具 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 等待下载完成 捐不起 配置环境变量 ope…

【ZZULIOJ】1035: 分段函数求值(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 已知&#xff1a;y是x的函数, 当x<-2时&#xff0c;y7-2x&#xff1b; 当x>-2,且x<3时&#xff0c;y5-|3x2|&#xff1b; 当x>3时&#xff0c;y3x4 输入 任意输入一个整数x。 输出 …