桂林手机网站建设,wordpress网站如何引流,张家口网站建设vewan,wordpress+技术类模板一、概念介绍
POJO#xff08;plain ordinary java object#xff09; #xff1a;
简单java对象#xff0c;个人感觉POJO是最常见最多变的对象#xff0c;是一个中间对象#xff0c;也是我们最常打交道的对象。一个POJO持久化以后就是PO#xff0c;直接用它传递、传递…一、概念介绍
POJOplain ordinary java object
简单java对象个人感觉POJO是最常见最多变的对象是一个中间对象也是我们最常打交道的对象。一个POJO持久化以后就是PO直接用它传递、传递过程中就是DTO直接用来对应表示层就是VO。POJO、PO、DTO、VO都是处理流程中的名字不是PO对应一个POJODTO对应一个POJOVO对应一个POJO在有些情况下PO、DTO、VO是指同一个POJO。
VOView Object
视图对象主要对应界面显示的数据对象。它的作用是把某个指定页面或组件的所有数据封装起来。如果是一个DTO对应一个VO则DTO等价于VO;但是如果一个DTO对应多个VO则展示层需要把VO转换为服务层对应方法所要求的DTO传送给服务层从而达到服务层与展示层解耦的效果。对于一个WEB页面或者SWT、SWING的一个界面用一个VO对象对应整个界面的值。
BObusiness object
业务对象主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。比如一个简历有教育经历、工作经历、社会关系等等。我们可以把教育经历对应一个PO工作经历对应一个PO社会关系对应一个PO。建立一个对应简历的BO对象处理简历每个BO包含这些PO。这样处理业务逻辑时我们就可以针对BO去处理。BO包括包含方法的实体对象(Entity Object)和不包含方法的值对象(VO)。
DTOData Transfer Object
数据传输对象主要用于远程调用等需要大量传输对象的地方。比如我们一张表有100个字段那么对应的PO就有100个属性。但是我们界面上只要显示10个字段客户端用WEB service来获取数据没有必要把整个PO对象传递到客户端这时我们就可以用只有这10个属性的DTO来传递结果到客户端这样也不会暴露服务端表结构.到达客户端以后如果用这个对象来对应界面显示那此时它的身份就转为VO。在这里我泛指用于展示层与服务层之间的数据传输对象。
DODomain Object
领域对象就是从现实世界中抽象出来的有形或无形的业务实体。它用来接收数据库对应的实体是一种抽象化的数据状态介于数据库与业务逻辑之间。一般在业务逻辑层Service对数据库SQL 进行访问时用于接收数据。xxxDOxxx即为数据表名。另外DO与Entity的不同点就是DO是与数据库存在着某种映射关系的Entity总的来说DO是Entity的一种。
POPersistent Object
持久化对象它跟持久层通常是关系型数据库的数据结构形成一一对应的映射关系如果持久层是关系型数据库那么数据表中的每个字段或若干个就对应PO的一个或若干个属性。最形象的理解就是一个PO就是数据库中的一条记录好处是可以把一条记录作为一个对象处理可以方便的转为其它对象。 二、区别
1、VO与DTO的区别
概念上还是应该存在VO和DTO因为两者有着本质的区别DTO代表服务层需要接收的数据和返回的数据而VO代表展示层需要显示的数据
2、DTO与DO的区别
DTO是展示层和服务层之间的数据传输对象可以认为是两者之间的协议而DO是对现实世界各种业务角色的抽象
3、DO与PO的区别
DO和PO在绝大部分情况下是一一对应的PO是只含有get/set方法的POJO但某些场景还是能反映出两者在概念上存在本质的区别
DO在某些场景下不需要进行显式的持久化例如利用策略模式设计的商品折扣策略会衍生出折扣策略的接口和不同折扣策略实现类这些折扣策略实现类可以算是DO但它们只驻留在静态内存不需要持久化到持久层因此这类DO是不存在对应的PO的。
同样的道理某些场景下PO也没有对应的DO例如老师Teacher和学生Student存在多对多的关系在关系数据库中这种关系需要表现为一个中间表也就对应有一个TeacherAndStudentPO的PO但这个PO在业务领域没有任何现实的意义它完全不能与任何DO对应上。
某些情况下为了某种持久化策略或者性能的考虑一个PO可能对应多个DO反之亦然。 PO的某些属性值对于DO没有任何意义这些属性值可能是为了解决某些持久化策略而存在的数据例如为了实现“乐观锁”PO存在一个version的属性这个version对于DO来说是没有任何业务意义的它不应该在DO中存在。同理DO中也可能存在不需要持久化的属性。
总结DO和PO是两个层级的概念两者存在一对一、一对多和多对一的关系。这两个层级的字段DO不需要包括全部的PO比如PO中的创建、删除标记、自动生成的ID等PO可以不用关注。 三、各层数据对象的职责和转换过程 基础层
入参是DO内部将DO转化成PO进行数据库的增删改查。
执行结果用PO去映射再转化为DO作为基础层的返回值。
先建立DO和PO的映射
当DO数据需持久化时仓储服务会将DO转换为PO
当DO需初始化时仓储服务从数据库获取数据形成PO并将PO转换为DO。
大多数情况下PO和DO一一对应。但也存在DO和PO多对多在DO和PO数据转换时需数据重组。
比如时间范围查询时会有辅助字段如beginTime和endTimePO这怎么处理我们的处理方式是增删改用PO查询时候用QueryPOQueryPO继承了PO并额外增加用于查询的辅助字段比如时间、集合、模糊查询等。
有的查询功能比如按照名称查询查询条件就是nameDTO、DO和PO是一样的也需要在每一层都去转化一下么我们把查询时的对象命名为QueryPO从用户接口层到基础层的入参都是这一个这样可以么是否要做数据转换主要是考虑解耦这样各层不必受其它层的数据限制它类似齿轮通过数据转换来做适配。
如果从前端到后端数据对象都是一样的用一个对象其实也是可以的。要结合自己的场景来分析。一般聚合根用的少很多情况聚合根要作为对象传到基础层。
领域层
入参是DO返回值是DO。
DO是实体和值对象的数据和业务行为载体承载基础的核心业务逻辑。通过DO和PO转换可完成数据持久化和初始化。
应用层
入参是DO返回值是DO。
如果需调用其它微服务的应用服务DO会转换为DTO完成跨微服务的数据组装和传输。用户接口层先完成DTO到DO的转换然后应用服务接收DO进行业务处理。如果DTO与DO是一对多的关系就需进行DO数据重组。
用户接口层
入参是DTO内部将DTO转化为DO后调用应用层
将应用层的结果转化为VO后返回给前台
完成DO和DTO的互转完成微服务与前端应用数据交互及转换。
Facade服务会对多个DO对象进行组装转换为DTO对象向前端应用完成数据转换和传输。
前端应用
主要是VO。展现层使用VO进行界面展示通过用户接口层与应用层采用DTO对象进行数据交互。 作者来源DOKER 多克