深入理解 Domain Objects

DAO (Data Access Object)数据访问对象

  • DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。
  • 一般在 业务逻辑层(Service) 对 数据库(SQL) 的访问时使用,一般能对SQL进行操作。
  • xxxDAO,xxx即为实体类名(Entity实体)

其它资料:在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。
DAO是微软的第一个面向对象的数据库接口。DAO对象封闭了Access的Jet函数。通过Jet函数,它还可以访问其他的结构化查询语言(SQL)数据库。

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

  • 数据传输对象 DTO (Data Transfer Object),是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。
  • 最早的目的是为了在EJB的分布式应用提供粗力度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载。现在更加广泛的应用方式是在 前端(Web)对控制层(Controller)进行数据传输时使用,即前端向后台提交数据。
  • xxxDTO,xxx为业务领域相关的名称。

DO (Domain Object)领域对象

  • 领域对象 DO 是从现实世界中抽象出来的有形或无形的业务实体。在与数据有关的操作中数据存在数据库使用 DAO访问被取出来时,一般会将这些数据规范化的定义成类,而这个类就是DO,用来接收数据库对应的实体,它是一种抽象化的数据状态,介于数据库与业务逻辑之间。
  • 一般在 业务逻辑层(Service) 对 数据库(SQL) 的 访问时 接收数据 使用。
  • xxxDO,xxx即为数据表名
    另外:DO与Entity概念上浅显的相同,他们在实际应用中是一个东西。稍微的不同点就是DO是与数据库存在着某种映射关系的Entity,总的来说DO是Entity的一种。

VO(View Object)视图模型

  • VO是显示视图模型,视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。如果是一个DTO对应一个VO,则DTO=VO;但是如果一个DTO对应多个VO,则展示层需要把VO转换为服务层对应方法所要求的DTO,传送给服务层。从而达到服务层与展示层解耦的效果。
  • 一般用在业务逻辑层(Service) 对 前端(Web) 的 视图模型效果控制的展示上,说白了就是后台向前端传输数据。
  • xxxVO,xxx一般为网页名称。

AO(Application Object)应用对象

  • AO是一个较为笼统的概念,因为太过于常见而并没有刻意的去描绘它的细节。举一个很简单的栗子:控制层(Controller) 在 业务逻辑层(Service) 查询一条或多条数据,这个数据的传输过程的运载就是AO完成。在正常的业务逻辑中一般都有很多种类型的数据,例如 整形、字符型、集合、类 等,我们把它统称为AO。
  • 控制层(Controller)业务逻辑层(Service)层之间抽象的复用对象模型,有时候极为贴近展示层,复用度不高。

BO( Business Object)业务对象

  • 业务对象(Business Object,BO)是对数据进行检索和处理的组件。主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象。形象描述为一个对象的形为和动作,当然也有涉及到基它对象的一些形为和动作。
  • 一般用在包含业务功能模块 的具体实例上,比如我们写了一个Controller、一个Service、一个DAO、一个工具类等等这一系列实例组合后能实现一些功能,这些一系列实例组合为一个组件,这个组件就是BO。

其它资料:是简单的真实世界的软件抽象。业务对象通常位于中间层或者业务逻辑层。BO支持序列化和反序列化,可以轻易地将BO的Java实例转换为一个XML文件或者一个流保存起来,并且在需要的时候,将这个BO从XML或者流中转换回一个Java实例。

POJO( Plain Ordinary Java Object)纯普通Java对象

  • 总的来说POJO包含DO、DTO、BO、VO,这些本质上都是一个简单的java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称
  • 使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接.。其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,这里特意说明纯普通Java对象,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。

PO(Persistent Object)持久化对象

  • 数据库表中的记录在java对象中的显示状态。最形象的理解就是一个PO就是数据库中的一条记录。
    好处是可以把一条记录作为一个对象处理,可以方便的转为其它对象。
  • 例如我们有一条数据,现在有一个简单类而且已经是被赋予了这条数据的实例,那么目前这条数据在这个简单类的存在状态就是PO,不管这个简单类是DO还是BO还是其他。PO只是数据持久化的一个状态。

Entity(应用程序域中的一个概念)实体

  • ADO .NET Entity Framework 应用程序域中的一个概念,数据类型在该域中定义。
  • 在计算机网络中,实体这一较为抽象的名词表示任何可能发送或接受信息的硬件或软件进程。在许多情况下,实体就是一个特定的软件模块。
  • 说白了Eitity是一个未被持久化的对象,它是一个类,从现实抽象到代码的一个类。

Model (概念实体模型)实体类和模型

  • Model是计算机程序设计中有两个概念:一个是三层架构中的实体类,另一个是MVC架构中的模型。
  • 在“三层架构”中,为了面向对象编程,将各层传递的数据封装成实体类,便于数据传递和提高可读性。
  • 在MVC(模型Model-视图View-控制器Controller)模式中,Model代表模型,是业务流程/状态的处理以及业务规则的制定,接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。

View (概念视图模型)视图模型

  • 在MVC(模型Model-视图View-控制器Controller)模式中,View代表视图,用来解析Model带来的数据模型,以展示视图数据,View的模型觉决定了需要什么样的Model来对接,相互联系。

————————————————
原文链接:https://blog.csdn.net/SR02020/article/details/105821816


Example

User table
user_id user_name pass_word create_time dept_id
Persistent Object(PO)

此时实现这个 class 的 object 对应着数据库中的每一条record,那么这个object就是一个PO。(class是用来映射数据库表的类,object是用来影射数据库表里每一行数据的对象)

class User {
  private Long userId;
  private String userName;
  private String passWord;
  private LocalDateTime createTime;
  private Long deptId;
  // getter/setter
}
Data Access Object(DAO)

一般多用来作为Mapper,UserMapper 表示用于封装数据库操作的一个映射对象
数据访问对象,顾名思义是封装所有对于数据访问CRUD操作的类(内容为数据库查询方法),用来访问数据库,然后业务逻辑可以直接注入DAO对象来使用。

interface/class UserDAO {
  public List<UserVO> getUserByCondition(UserDTO userDto, Page page);
  public User getUserById(Long userId);
  public int deleteUserByBatchIds(List<Long> userIds);
  public int editUser(UserDTO userDto);
  public int addUser(UserDTO userDto);
}

如果出现了公共访问操作方法,不需要给多个DAO重复定义,只需要创建一个 BaseMapper 即可,这也是 MybatisPlus 的思路。public interface UserMapper extends BaseMapper<User>

Business Object(BO)

封装了业务逻辑的对象,一般在开发中,封装成对象或者复杂对象,可包含多个类。我们可以理解为一个BO可以包含一个或者多个POs来进行自由组合

Data Transfer Object(DTO)& View Object(VO)

这个需要和VO区分开,比如我们在不同需求下的VOs是不一样的,那么会有以下

  • Vos
View-Object-1
{
  "userName": "Alan Rickman",
  "passWord": "R.I.P"
}
View-Object-2
{
  "userName": "Alan Rickman",
  "createTime": "1997-06-26"
}
  • DTO
Data-Transfer-Object
{
  "userId": "alan.rickman",
  "userName": "Alan Rickman",
  "passWord": "R.I.P",
  "createTime": "1997-06-26",
  "deptId": "126"
}

此时虽然VO是用的object不一样,但里面字段都是从DTO中来的,那么我们可以认为此时DTO就是一个包含原始数据的object


Flow: Http request -> Controller/Provider -> Service -> Database

《阿里巴巴Java开发规范》

  • DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象
  • DTO(Data Transfer Object):数据传输对象,Service 或 Manager 向外传输的对象
  • BO(BusinessObject):业务对象,由 Service 层输出的封装业务逻辑的对象
  • AO(ApplicationObject):应用对象,在Web层与Service层之间抽象的复用对象模型, 极为贴近展示层,复用度不高。
  • VO(View Object):显示层对象,通常是 Web 向模板渲染引擎层传输的对象。
  • Query:数据查询对象,各层接收上层的查询请求。注意超过 2 个参数的查询封装,禁止使用 Map 类来传输。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容