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

2024-04-04 14:28
文章标签 po dao pojo vo bo dto

本文主要是介绍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. 渲染完成后的结果被返回给客户端。

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

这篇关于DO、DTO、BO、VO、PO、DAO、POJO的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/876031

相关文章

Caused by: org.hibernate.MappingException: Could not determine type for: org.cgh.ssh.pojo.GoodsType,

MappingException:这个主要是类映射上的异常,Could not determine type for: org.cgh.ssh.pojo.GoodsType,这句话表示GoodsType这个类没有被映射到

Hibernate插入数据时,报错:org.springframework.dao.DataIntegrityViolationException: could not insert: [cn.itc

在用junit测试:插入数据时,报一下错误: 错误原因: package junit;import org.junit.Test;import cn.itcast.crm.container.ServiceProvinder;import cn.itcast.crm.dao.ISysUserDao;import cn.itcast.crm.domain.SysRole;

DTO类实现Serializable接口的重要性

所谓序列化,简单一点理解,就是将对象转换成字节数组,反序列化是将字节数组恢复为对象。凡是要在网络上传输的对象、要写入文件的对象、要保存到数据库中的对象都要进行序列化。Java对象是无法直接保存到文件中,或是存入数据库中的。如果要保存到文件中,或是存入数据库中,就要将对象序列化,即转换为字节数组才能保存到文件中或是数据库中。文件或者数据库中的字节数组拿出来之后要转换为对象才能被我们识别,即反序列化。

hibernate泛型Dao,让持久层简洁起来

【前言】hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据库。同时,作为后台开发的支撑,的确扮演了一个举足轻重的角色,那么我们在项目中如何灵活应用hibernate,也会给项目维护以及项目开发带来便利,下面我将展示我们项目中是如何来对hibernate进行应用和操作。 【目录】              -

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶斯算法优化X

设计之道:ORM、DAO、Service与三层架构的规范探索

引言: 实际开发中,遵守一定的开发规范,不仅可以提高开发效率,还可以提高项目的后续维护性以及项目的扩展性;了解一下本博客的项目设计规范,对项目开发很有意义 一、ORM思想 ORM(Object-Relational-Mapping)在对象模型和关系型模型之间做一个映射(转换)。 目的是为了解决面向对象编程语言的发展和关系型数据库的发展不匹配的问题 可以理解为: 将Java中的数据结

某PO手机市场竞争分析,巧用波特五力分析法找出核心竞争力!

某PO手机主要从事手机的生产与销售,最近推出了新款 Reno 系列 5G 手机。当前,苹果占据了高端市场,华为占据了中高端市场,而某 PO 手机则在剩余市场中与某 VO 和某米竞争。近年来,某 PO手机凭借中端 R 系列逐步取得市场份额。在这样的背景下,我们运用波特五力模型来分析某 PO 手机的外部环境。 1、波特五力模型案例分析:某PO手机 1.1 新进入者的威胁 由于电子产品市场竞争激烈

最佳MyBatis 根据表结构自动生成代码, domain, dao, mapper 文件

摘要: 接触mybatis时间不是很长, 但是感觉也还容易上手, 好处发现也很多, 觉得还挺方便, 这段时间又学习一下MyBatis自动生成代码. 觉得在效率上更好了, 所以分享一下自动生成代码的步骤. 首先, 看看我的项目的包结构, 用的IDEA13.1,gradle包管理工具, ...其他的就没什么可说的; 今天, 主要讲 generator 里面的东西; mysql的jar包是

selenium 自动化之七----自动化测试PO设计模式

PO(Page Object) 是selenium 自动化测试项目开发的设计模式之一,主要体现在页面交互的封装,使测试案例关注与业务而非页面谢姐,提高测试的可读性 PO 设计模式的有点 :减少代码重复,提高用例可读性,提供用例的维护性及UI频繁变化的项目 ,可以通过page对象封装一个HTML页面,可以通过提供的api来操作页面元素,不用满大街的四处找元素 PO的工作原理:就是一步一步封装分离

由“为什么VO不能继承PO?” 引出的为什么组合优于继承?

简述VO、DTO、PO的概念。 如下概念是我个人的理解: VO(View Object): 视图对象,用于展示,这很好理解,就是前端页面所需数据封装,一般所需要的属性比 PO 多并且。DTO(Data Transfer Object): 数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低