目录

  • 概念
    • 关于do的理解
  • 业务逻辑分层
  • 基于springboot的逻辑分层结构
  • 什么时候需要定义这么多O
  • 实际项目中的使用方式
    • 同一微服务中
    • 不同微服务
    • 一般起名规则

概念

  • VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
  • DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,更符合泛指用于展示层与服务层之间的数据传输对象。
  • BO(Business Object):业务对象,把业务逻辑封装为一个对象,这个对象可以包括一个或多个其它的对象。
  • PO(Persistent Object):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
  • DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

关于do的理解

do和po很难理解,这个地方举个例子,比如我有一个po存储了某种商品的价格原始信息,但是当我的service中要读取商品的价格信息的时候,除了需要这些原始信息,还需要根据折扣再要基准折扣价之类的信息,而这类信息是要通过数据库中已有信息计算得到的。
简而言之,service在读取po的时候,需要在po外增补一些冗余数据、而这些数据,通常不会保存在数据库中,但又是多个service共用的。这类数据

  1. 放在service中new一个自定义对象不合适,因为其他service中也经常要用,这样无法做到service间代码的复用
  2. 直接用po也不合适,因为po是直接操作数据库对象的,数据库中也没有这个冗余字段。

所以此时最好是在serveice层和dao层之间,再抽象出一个o,其中不只存放了po的基础信息,还存储了一些基于po的冗余计算属性,或者对po做一些魔改。
但是现在由于使用的jpa或mybatis框架,是支持标明entity中哪些属性是db的原始属性,哪些属性不是db中的属性的,实际上做的事情就是将do和po做了整合,以后可以认为不需要单独再搞一个do对象进行数据操作了。

业务逻辑分层

M层负责与数据库打交道;

C层负责业务逻辑的编写;

V层负责给用户展示(针对于前后端不分离的项目,不分离项目那种编写模版的方式,理解V的概念更直观)。

基于springboot的逻辑分层结构

以上逻辑分层翻译成常见的springboot结构就是

什么时候需要定义这么多O

项目中真的有必要定义VO,BO,PO,DO,DTO吗?按照理论上来讲

  • 如果项目比较小,是一个简单的MVC项目,又是单兵作战,我不建议使用VO,BO,PO,DO,DTO,直接用POJO负责各个层来传输就好,因为这种项目的“目的地”是快速完成。
  • 而我们更多的时候,是持续迭代的团队协作项目,这个时候我们就建议用VO,BO,PO,DO,DTO,而且团队内要达成共识,形成一个标准规范

目的是提升项目的可扩展性可维护性可阅读性

其实要不要用这么多o,关键问题在于关注controller、service、dao这些层间数据有没有变化。比如vo传进来,放进service直接拆成po,那就没有dto什么事。如果存在rpc调用,就需要考虑一下,要不要新加一个object。对象数量的选择,完全根据层间数据变化来决定

实际项目中的使用方式

同一微服务中

一般controller向service传的数据和service向controller传的数据不一定相同,这就导致每层的dto、po等对象都可能有两个

不同微服务

因为不同微服务中涉及到RPC远程调用,所以经常会有重复的object对象出现在不通服务中。

一般起名规则

名称中,要写明对象涉及的两层逻辑,最好再写明数据流向。

vo、dto、bo、do、po的概念理解以及与controller、service、dao层的对应关系相关推荐

  1. VO,DTO,BO,POJO,PO的概念介绍

    po: 1.po:popersistent object 持久对象,持久对象的意思指的是可以从内存中存储到关系型数据库中. 2.因此一个po对应的数据库中的每一条记录. pojo: 1. pojo:p ...

  2. 领域驱动模型VO,BO,PO,DO,DTO概念及其区别

    本文来说下领域驱动模型VO,BO,PO,DO,DTO 概念及其区别 文章目录 概述 概念以及区别 本文小结 概述 随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等),伴随着这 ...

  3. 一文理解什么是DTO、VO、BO、PO、DO,并推荐一款IDEA转换插件

    1.什么是DTO.VO.BO.PO.DO.POJO POJO的定义是无规则简单的对象,在日常的代码分层中pojo会被分为VO.BO. PO. DTO.通过各层POJO的使用,有助于提高代码的可读性和可 ...

  4. 关于VO,BO,PO,DO,DTO的简单理解

    一.关于VO,BO,PO,DTO的简单理解 VO(Value Object)值对象 值对象:每一个字段与视图层所需要的字段对应 ,可以理解为vo里面的字段,和前端请求参数里面的字段相对应 DTO(Da ...

  5. 真的有必要定义VO,BO,PO,DO,DTO吗?

    今天给大家带来一篇关于VO,BO,PO,DO,DTO的文章,阅读完这篇文章之后,希望大家对VO,BO,PO,DO,DTO有自己的见解. VO,BO,PO,DO,DTO 概念 在讲具体的概念之前,我们先 ...

  6. 项目开发中,真的有必要定义VO,BO,PO,DO,DTO这些吗?

    点击关注公众号,实用技术文章及时了解 存在即是合理的,业务复杂,人员协同性要求高的场景下,这些规范性的东西不按着来虽然不会出错,程序照样跑,但是遵守规范会让程序更具扩展性和可读性,都是前辈血淋淋的宝贵 ...

  7. 一篇文章讲清楚VO,BO,PO,DO,DTO的区别

    随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等),伴随着这些编程模型,又有一大批新的概念蜂拥而至,什么VO,BO,PO,DO,DTO之类的,这些新的概念一直以来都是云里雾里 ...

  8. Java中的VO,BO,PO,DO,DTO

      随着现在后端编程标准化程度越来越高,各种编程模型层出不穷.作为Java开发人员,大部分人不免要接触VO,BO,PO,DO,DTO之类的,但很多人对这些概念一直以来都是云里雾里,团队开发过程中也总是 ...

  9. VO、BO、PO、DO、DTO的区别

    随着编程工业化水平的不断加深,各种编程模型层出不穷(比如MVC,MVP等等),伴随着这些编程模型,又有一大批新的概念蜂拥而至,什么VO,BO,PO,DO,DTO之类的,这些新的概念一直以来都是云里雾里 ...

最新文章

  1. 0x53. 动态规划 - 区间DP(习题详解 × 8)
  2. Jquery中实现表单提交到SSM后台前进行post请求实现数据的校验
  3. 数据库面试题【十五、优化查询过程中的数据访问】
  4. 如何出(改编)一道ACM算法题?
  5. php购物车(session)
  6. openstack 功能_2016年OpenStack的新功能:看一下Newton版本
  7. maven中plugins和pluginmanagement的区别
  8. GFP_KERNEL的作用
  9. 间通过蓝牙模块建立通讯_拥抱蓝牙mesh,幻腾用“互联”深化智能
  10. linux安装i3wm桌面环境,ArchLinux基本安装后安装i3wm基本环境
  11. appleId登录java
  12. 一点浩然气,千里快哉风(修炼孟子浩然之气)
  13. Google Analytics中的基本度量四 “页面停留时间和网站停留时间
  14. mysql6.2中文补丁_2.6. 在NetWare中安装MySQL - MySQL 中文手册
  15. 关于云音乐数据治理的实践与思考
  16. P3387 【模板】缩点 洛谷 java题解 连通图+拓扑排序
  17. Ruby on Rails 之旅(七)—— Ruby on Rails 入门(5)
  18. 华中科技大学有计算机科学与技术学院导师,华中科技大学计算机科学与技术学院导师简介-徐鹏...
  19. 从量变到质变,中国移动在5G时代或将处于不利地位
  20. 梦想汽车 NFT 系列

热门文章

  1. 天猫年货节助手、京东年货节助手,自动完成任务领取奖励,解放双手
  2. 5月Github上最热门的数据科学和机器学习项目TOP5
  3. excel编辑csv文件
  4. 计算机图形学-油画家算法
  5. unity如何插入图片_unity 图片导入及其使用方法
  6. codeforces每日5题(均1500)-第八天
  7. 很不错的SQLite工具 SQLiteSpy
  8. java闹钟程序_java 闹钟程序
  9. Ubuntu查看USB串口号【简单、好记、好看】
  10. 5个增加设计趣味性的方法