ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

PO,BO,VO和POJO的区别

2022-05-06 22:03:18  阅读:240  来源: 互联网

标签:DO DTO 对象 数据库 BO POJO PO


PO:持久对象

  • PO:persistent object 持久对象
    1. 有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。
    2. 在hibernate持久化框架中与insert/delet操作密切相关。
    3. PO中不应该包含任何对数据库的操作。
    4. 它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。

POJO:无规则简单java对象

  • POJO:plain ordinary java object 无规则简单java对象、PO和VO都属于它。
  • 是一个中间对象,可以转化为PO、DTO、VO。
    1. POJO持久化之后==〉PO
      -(在运行期,由Hibernate中的cglib动态把POJO转换为PO,PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。PO对于programmer来说完全透明,由于是运行期生成PO,所以可以支持增量编译,增量调试。)
    2. POJO传输过程中==〉DTO
    3. POJO用作表示层==〉VO

BO:business object 业务对象

  • 业务对象主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象,用来封装PO
  • 比如一个简历,有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个PO,工作经历对应一个PO,社会关系对应一个PO。
  • 建立一个对应简历的BO对象处理简历,每个BO包含这些PO。
  • 这样处理业务逻辑时,我们就可以针对BO去处理。
  • 封装业务逻辑为一个对象(可以包括多个PO,通常需要将BO转化成PO,才能进行数据的持久化,反之,从DB中得到的PO,需要转化成BO才能在业务层使用)。
  • 关于BO主要有三种概念
    1. 只包含业务对象的属性;
    2. 只包含业务方法;
    3. 两者都包含。
  • 在实际使用中,认为哪一种概念正确并不重要,关键是实际应用中适合自己项目的需要。

VO:value object 值对象 / view object 表现层对象

  1. 主要对应页面显示(web页面/swt、swing界面)的数据对象。用于表现层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
  2. 可以和表对应,也可以不,这根据业务的需要。

DTO(TO):Data Transfer Object 数据传输对象

  1. 用在需要跨进程或远程传输时,它不应该包含业务逻辑。泛指用于展示层与服务层之间的数据传输对象。
  2. 比如一张表有100个字段,那么对应的PO就有100个属性(大多数情况下,DTO内的数据来自多个表)。但view层只需显示10个字段,没有必要把整个PO对象传递到client,这时我们就可以用只有这10个属性的DTO来传输数据到client,这样也不会暴露server端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

DAO:data access object数据访问对象

  1. 主要用来封装对DB的访问(CRUD操作)。
  2. 通过接收Business层的数据,把POJO持久化为PO。

DO(Domain Object):

  • 领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。

简易的关系图

image

VO与DTO的区别

  • 大家可能会有个疑问:既然DTO是展示层与服务层之间传递数据的对象,为什么还需要一个VO呢?对!对于绝大部分的应用场景来说,DTO和VO的属性值基本是一致的,而且他们通常都是POJO,因此没必要多此一举,但不要忘记这是实现层面的思维,对于设计层面来说,概念上还是应该存在VO和DTO,因为两者有着本质的区别,DTO代表服务层需要接收的数据和返回的数据,而VO代表展示层需要显示的数据。
  • 用一个例子来说明可能会比较容易理解:例如服务层有一个getUser的方法返回一个系统用户,其中有一个属性是gender(性别),对于服务层来说,它只从语义上定义:1-男性,2-女性,0-未指定,而对于展示层来说,它可能需要用“帅哥”代表男性,用“美女”代表女性,用“秘密”代表未指定。说到这里,可能你还会反驳,在服务层直接就返回“帅哥美女”不就行了吗?对于大部分应用来说,这不是问题,但设想一下,如果需求允许客户可以定制风格,而不同风格对于“性别”的表现方式不一样,又或者这个服务同时供多个客户端使用(不同门户),而不同的客户端对于表现层的要求有所不同,那么,问题就来了。再者,回到设计层面上分析,从职责单一原则来看,服务层只负责业务,与具体的表现形式无关,因此,它返回的DTO,不应该出现与表现形式的耦合。

DTO与DO的区别

  • 首先是概念上的区别,DTO是展示层和服务层之间的数据传输对象(可以认为是两者之间的协议),而DO是对现实世界各种业务角色的抽象。
  • 两者在数据上的区别就是DTO可以省略一些DO不需要返回给前端的字段。
  • 例如UserInfo和User,对于一个getUser方法来说,本质上它永远不应该返回用户的密码,因此UserInfo至少比User少一个password的数据。而在领域驱动设计中,DO不是简单的POJO,它具有领域业务逻辑。

DO与PO的区别

  • DO和PO在绝大部分情况下是一一对应的,PO是只含有get/set方法的POJO,但某些场景还是能反映出两者在概念上存在本质的区别:
  • DO在某些场景下不需要进行显式的持久化,例如利用策略模式设计的商品折扣策略,会衍生出折扣策略的接口和不同折扣策略实现类,这些折扣策略实现类可以算是DO,但它们只驻留在静态内存,不需要持久化到持久层,因此,这类DO是不存在对应的PO的。
  • 同样的道理,某些场景下,PO也没有对应的DO,例如老师Teacher和学生Student存在多对多的关系,在关系数据库中,这种关系需要表现为一个中间表,也就对应有一个TeacherAndStudentPO的PO,但这个PO在业务领域没有任何现实的意义,它完全不能与任何DO对应上。这里要特别声明,并不是所有多对多关系都没有业务含义,这跟具体业务场景有关,例如:两个PO之间的关系会影响具体业务,并且这种关系存在多种类型,那么这种多对多关系也应该表现为一个DO,又如:“角色”与“资源”之间存在多对多关系,而这种关系很明显会表现为一个DO——“权限”。
  • 某些情况下,为了某种持久化策略或者性能的考虑,一个PO可能对应多个DO,反之亦然。例如客户Customer有其联系信息Contacts,这里是两个一对一关系的DO,但可能出于性能的考虑(极端情况,权作举例),为了减少数据库的连接查询操作,把Customer和Contacts两个DO数据合并到一张数据表中。反过来,如果一本图书Book,有一个属性是封面cover,但该属性是一副图片的二进制数据,而某些查询操作不希望把cover一并加载,从而减轻磁盘IO开销,同时假设ORM框架不支持属性级别的延迟加载,那么就需要考虑把cover独立到一张数据表中去,这样就形成一个DO对应对个PO的情况。
  • PO的某些属性值对于DO没有任何意义,这些属性值可能是为了解决某些持久化策略而存在的数据,例如为了实现“乐观锁”,PO存在一个version的属性,这个version对于DO来说是没有任何业务意义的,它不应该在DO中存在。同理,DO中也可能存在不需要持久化的属性。

entity和domain包名区别

  • (1)、entity(实体)
    • entity的意思就是实体的意思,所以也是最常用到的,entity包中的类是必须和数据库相对应的,比如说:数据库有个user表,字段有long类型的id,string类型的姓名,那么entity中的user类也必须是含有这两个字段的,且类型必须一致。不能数据库存的是long类型,user类里的属性是string类型。这样做的好处是保持实体类和数据库保持一致,另外,当用到hibernate或是mybatie框架来操作数据库的时候,操作这个实体类就行,写sql文之前不需要再做数据格式处理。
  • (2)、model(模型)
    • model大家不陌生,都知道是模型的意思,当用model当包名的时候,一般里面存的是实体类的模型,一般是用来给前端用的。比如:前端页面需要显示一个user信息,user包含姓名,性别,居住地,这些信息存在数据库的时候,姓名直接存姓名,但是性别和居住地一般会用数据字典的编号存到数据库,比如:111代表男,222代表女,数据库存的就是111或222,如果用entity的话,把111、222前端都不知道是什么玩意,就算前端知道111代表男,222代表女,写了一个js判断数据处理。后来数据库变动了,111代表女,222代表男,前端的js又需要重新写,很显然这样不利于维护。所以就需要model来解决,后台从数据库取了数据转化为前端需要的数据直接传给前端,前端就不需要对数据来处理,直接显示就行了。还有一种情况,数据库里面的user表字段有十个,包含姓名,qq,生辰八字乱七八糟的等,但是前台页面只需要显示姓名,如果把entity全部传给前台,无疑传了很多没用的数据。这时候model就很好的解决了这个问题,前台需要什么数据,model就包含什么数据就行了

(3)、domain(域) (DO)

  • domain这个包国外很多项目经常用到,字面意思是域的意思。范围有点广了,比如一个商城的项目,商城主要的模块就是用户,订单,商品三大模块,那么这三块数据就可以叫做三个域,domain包里就是存的就是这些数据,表面上这个包和entity和model包里存的数据没什么区别,其实差别还是挺大的,特别是一些大型的项目。比如一个招聘网站的项目,最重要的对象就是简历了,那么简历是怎么存到数据库的呢,不可能用一张表就能存的,因为简历包含基本信息和工作经验,项目经验,学习经验等。基本信息可以存在简历表,但是涉及到多条的就不行,因为没人知道有多少条工作经验,项目经验,所以必须要单独建工作经验表和项目经验表关联到简历基本信息表。但是前台页面是不关心这些的,前台需要的数据就是一个简历所有信息,这时就可以用到domain来处理,domain里面的类就是一个简历对象,包含了简历基本信息以及list的工作经验,项目经验等。这样前端只需要获取一个对象就行了,不需要同时即要获取基本信息,还要从基本信息里面获取工作经验关联的简历编号,然后再去获取对应的工作经验了。

三句话总结下entity、model、domain的不同

  1. entity字段:必须和数据库字段一样
  2. model字段:前端需要什么我们就给什么
  3. domain很少用,代表一个对象模块

实体entity、JavaBean、Model、POJO、domain的区别

  • Java Bean、POJO、Entity、VO ,其实都是java 对象,只不过用于不同场合罢了。
  • 按照 Spring MVC 分层结构:
    • JavaBean: 表示层 (Presentation Layer)
    • Entity: 业务层 (Service layer)
    • Dao数据访问层 (data access layer)。
  • Entity接近原始数据,Model接近业务对象~
  • Entity:是专用于EF的对数据库表的操作
  • Model:是为页面提供数据和数据校验的,所以两者可以并存
  • POJO:POJO是Plain OrdinaryJava Object的缩写不错,但是它通指没有使用Entity Beans的普通- - java对象,可以把POJO作为支持业务逻辑的协助类。
  • domain:domain这个包国外很多项目经常用到,字面意思是域的意思。
  • POJO实质上可以理解为简单的实体类,顾名思义POJO类的作用是方便 程序员使用数据库中的数据表,对于广大的程序员,可以很方便的将POJO类当做对象来进行使用,当然也是可以方便的调用其get,set方法。
  • JavaBean: 先说JavaBean,JavaBean更多的是一种规范,也即包含一组set和get方法的Java对象。
  • POJO: 普通的Java对象,对于属性一般实现了JavaBean的标准,另外还可以包含一些简单的业务逻辑(方法)。
  • **PO: **POJO在持久层的体现,对POJO持久化后就成了PO。PO更多的是跟数据库设计层面相关,一般PO与数据表对应,一个PO就是对应数据表的一条记录。
  • **DAO: **PO持久化到数据库是要进行相关的数据库操作的(CRUQ),这些对数据库操作的方法会统一放到一个Java对象中,这就是DAO。
  • **BO: **POJO在业务层的体现,对于业务操作来说,更多的是从业务上来包装对象,如一个User的BO,可能包括name, age, sex, privilege, group等,这些属性在数据库中可能会在多张表中,因为每一张表对应一个PO,而我们的BO需要这些PO组合起来(或说重新拼装)才能成为业务上的一个完整对象。
  • VO(Value Object/View Object): POJO在表现层的体现。 当我们处理完数据时,需要展现时,这时传递到表现层的POJO就成了VO。它就是为了展现数据时用的。
  • **DTO(Data Transfer Object): **POJO在系统间传递时。当我们需要在两个系统间传递数据时,一种方式就是将POJO序列化后传递,这个传递状态的POJO就是DTO。
  • EJB(Enterprise JavaBean): 我认为它是一组”功能”JavaBean的集合。上面说了JavaBean是实现了一种规范的Java对象。这里说EJB是一组JavaBean,的意思是这一组JavaBean组合起来实现了某个企业组的业务逻辑。这里的一组JavaBean不是乱组合的,它们要满足能实现某项业务功能的搭配。找个比方,对于一身穿着来说,包括一顶帽子,一件衣服,一条裤子,两只鞋,这穿着就是EJB.

标签:DO,DTO,对象,数据库,BO,POJO,PO
来源: https://www.cnblogs.com/ds521/p/16231024.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有