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

VO、DTO、BO、PO、DO、POJO 数据模型的理解和实际使用

一、概念讲解

  • VO(View/Value Object)—— 视图对象
    用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
  • DTO(Data Transfer Object)—— 数据传输对象
    这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
  • BO(Business Object)—— 业务对象
  • PO(Persistent Object)—— 持久对象
    持久化对象(例如:entity、bean),他跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
  • DO(Data/Domain Object)—— 数据/领域对象
    就是从现实世界中抽象出来的有形或无形的业务实体。
  • POJO(Plain Old/OrdinaryJava Object)—— 以上模型的统称
    POJO 是简单的 Java 对象,不包含业务逻辑、能够控制自己内部所有属性访问的 Java 对象。

二、概念澄清

JavaBean vs POJO

  • JavaBean 其实是 POJO 的一种形式(JavaBean < POJO
JavaBeanPOJO
没有业务逻辑没有业务逻辑
必须构造函数无需构造函数
private 修饰成员变量成员变量的修饰符无限制

三、使用场景

关系图说明:
在这里插入图片描述

从上到下依次说明:

  • VO(View/Value Object)—— 视图对象
    VO 就是展示用的数据,不管展示方式是网页、客户端、APP,只要是这些数据用于展示给人看的就是 VO

  • DTO(Data Transfer Object)—— 数据传输对象
    数据传输对象比较特殊,之所以将DTO绘制在【展示层】和【业务逻辑层】之间,是因为它有两种存在形式:

    • 前端:它是以Json字串的形式存在
    • 后端:它是以Java对象的形式存在

    微服务之间DTO对象的模型鉴定形式:

    • 服务(模块)与服务(模块)之间相对独立,我们可以将数据传输对象命名为 DTO
    • 服务(模块)与服务(模块)之间不是独立,每一个都不是一个完整的业务模块,拆分可能仅仅是因为计算复杂度或者性能问题考虑拆分的问题,那么就不能将对象命名为 DTO只能BO
VO vs DTO
区别一:
字段可能不一样,VO 会根据实际情况,对字段有所删减
区别二:
属性值可能不一样,VO 会根据 DTO 中对值进行展示业务对解释(比如:为不暴露数据库字段,修改属性名称、敏感字段不展示等等)
  • BO(Business Object)—— 业务对象
    BO 就是 PO 的组合

    • 简单解释:
      比如:PO 是一个交易记录,BO 就是一个人全部的交易记录集合对象
    • 复杂解释:
      比如:PO1 是交易记录,PO2 是登录记录、PO3 是商品浏览记录、PO4 是添加购物记录,BO 就是个人网站行为对象
  • PO(Persistent Object)—— 持久对象
    简单的说 PO就是数据库中的记录,一个 PO 的数据结构对应着库中的表结构,表中的一条记录就是一个 PO 对象。对于 PO 来说,数量是相对固定的,不会超过数据库中表的数量。等同于 Entity,它两概念是一致的。

  • DO(Data/Domain Object)—— 数据/领域对象

    • 阿里开发手册
      DO 等同于 PO
    • DDD 领域驱动设计
      DO 等同于 BO
DO vs DTO
这两个的区别主要也是字段的删减。
BO 对内,为了进行业务计算需要辅助数据或者一个业务有多个对外接口,BO 可能会含有很多接口对外所不需要的数据,因此 DTO 需要在 BO 的基础上选取自己所需的数据赋值。

四、经验总结

  1. PO(Entity) 这个是没有办法省略的,所有涉及数据库操作的都需要有持久化对象
  2. 不是非常大型的简单系统,DTOBO 可以合并为一个,当业务扩展的时候注意拆分即可
  3. 概念是给人用的,多人协作的时候一定要保证大家的概念一致。请勿形而上学、过度设计、一切设计都基于现有的业务规则和系统大小

五、拓展阅读

  • 浅析VO、DTO、DO、PO的概念、区别和用处
    大佬11年发布的文章,该博客有项目经验辅佐他的观点,在概念、区别、应用上层层递进。
  • VO、DTO、BO、DO、PO、POJO、Entity的概念、区别和应用
    该博客是上面的排版了一下,天下文章一大抄,哈哈,不过看着确实舒服点
http://www.lryc.cn/news/2417824.html

相关文章:

  • 360影视大全 python_「www.dy2018.com」python爬取电影天堂(www.dy2018.com)所有视屏的所有链接 - 金橙教程网...
  • 奇异值分解(SVD)详解及其应用
  • JSONP原理以及示例
  • 【802.11】MCS简介
  • sql语句中distinct的用法
  • Netcat使用学习
  • Jfinal 框架简单入门
  • ftp客户端使用详细说明【linux和windows】
  • STM32F103C8t6驱动MPU6050+HMC5883L+BMP280进行三轴姿态解算
  • JS 中 String 的字符串截取 substr 和 substring 区别的快速记忆方法
  • Ubuntu——apt-get问题
  • 电子工程师必备网址
  • VNC Server远程桌面配置详解
  • 探秘Magnetissimo:自托管的磁力链接搜索引擎
  • react-native基本介绍
  • Attributes(特性)与 Properties(属性)的区别
  • 架构设计(1)-谈谈架构
  • 12 个超好用的免费在线工具建议收藏!(非常详细)从零基础入门到精通,看完这一篇就够了
  • HTTP部分详细讲解以及代码实现(二)
  • epoll原理详解及epoll反应堆模型
  • NLP深入学习——分词(Segmentation )
  • 算法 001. 辗转相除法(欧几里得算法)求最大公约数
  • 视图的基本操作
  • Linux ps命令详解
  • 关于.NET、ASP.NET和ASP
  • Gson的用法详解_Gson如何进行进行序列化和反序列化
  • python的符号lt和gt怎么输入_lt;lt;Python基础教程gt;gt;学习笔记 | 第04章 | 字典...
  • 科普:SMP系统是什么
  • RISC-V CPU+GPU+AI,Imagination创新解决方案带来了哪些惊喜?
  • WebShell