DAO Data Access Object,数据访问对象

DAO是一个软件设计的指导原则,在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。

简单的说,DAO就是对数据库中数据的增删改查等操作封装在专门的类里面,在业务逻辑层中如果要访问数据的时候,直接调用该DAO类(包括了如何访问数据库和数据的增删改查等等代码),就可以返回数据,而不需要再在业务逻辑层中写这些代码。

ORM概念

面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。

在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。

当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。

面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象-关系映射(Object/Relation Mapping,简称ORM)技术应运而生。

对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

对象关系映射(ORM)提供了概念性的、易于理解的模型化数据的方法。ORM方法论基于三个核心原则:

  1. 简单:以最基本的形式建模数据。
  2. 传达性:数据库结构被任何人都能理解的语言文档化。
  3. 精确性:基于数据模型创建正确标准化了的结构。

典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须能够用非技术企业专家可以理解的术语在概念层次上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这种联系。

ORM不是DAO这样的指导原则,它往往依赖一个具体的库实现。一般的ORM包括以下四部分:

  1. 一个对持久类对象进行CRUD操作的API;
  2. 一个语言或API用来规定与类和类属性相关的查询;
  3. 一个规定mapping metadata的工具;
  4. 一种技术可以让ORM的实现同事务对象一起进行dirty checking, lazy association fetching以及其他的优化操作。

ORM 类型

1. ActiveRecord

软件工程中,Active Record(简称AR)模式是软件里的一种架构性模式,主要概念是关系型数据库中的数据在内存中以对象的形式存储。由Martin Fowler在其2003年初版的书籍《Patterns of Enterprise Application Architecture》命名。遵循该模式的对象接口一般包括如Insert, Update, 和 Delete这样的函数,以及对应于底层数据库表字段的相关属性。

AR模式是一种访问数据库数据的方式。数据表或视图被映射成一个类。每个对象实例则对应于表的一条记录。对象被创建后,通过save就可以向表中新添一行记录。当对象被更新时,表中相应记录也被更新。这个包裹类通过属性或方法的形式实现访问表或视图中的每一个字段。

该模式主要被对象持久化工具采用,用于对象关系映射 (ORM). 典型的,外键关系会以合适的对象实例属性的形式暴露访问。

2. Row Data Gateway

Row Data Gateway模式中每个对象也封装了数据库记录的状态和持久化到数据库的访问方法; 这两个有时候很难区分. 细微的区别在于Row Data Gateway不封装任何业务逻辑;

3. TableGateway

TableGateway是一种数据访问模式, 对每个表有一个类, 类的方法封装了对单个表的数据操作, 如CRUD; 方法的接受表字段的值作为参数;

比如说对表Person有Person DAO, 有以下方法:

int Create(string name, bool isMale)
DataSet Find(int personId)
void Delete(int personId)
void Update(int personId, string name, bool isMale)

微软的很多代码示例中使用了此模式;

ActiveRecord的区别在于ActiveRecord的对象中保持了记录的值, 是有状态的, 而TableGateway是没有状态的, 只是一系列数据库访问方法的集合;

Table Module

Table Module是一种领域逻辑模式, 一个类对应于数据库中的一个表; Table Module通常和Table Gateway合作, 前者负责基本的业务逻辑, 后者负责数据库访问, 以达到逻辑层和持久化层的隔离; 微软的实例代码经常使用这两者, 如对表Person, 通常会定义两个类, PersonBL和PersonDB, 在PersonBL中处理验证等逻辑, 并调用PersonDB访问数据库, 层间调用使用DataSet或自定义数据传输对象传输数据

在业务逻辑比较简单并且有和表的一一对应时, ActiveRecord相对来说更简单, 因为它在一个类中包括了业务逻辑对象和数据访问, 而且不需要数据传输对象, 减少了维护的工作量;和Table Module比较起来, ActiveRecord与数据库耦合更紧。

转载于:https://www.cnblogs.com/x3d/p/6250560.html

ActiveRecord模式整理相关推荐

  1. Atitit orm的实现模式 data-mapper模式和active-record模式有什么区别

    Atitit orm的实现模式  data-mapper模式和active-record模式有什么区别 1.1. 这是来自Node.js路线有关混合两种ORM模式Active Record(活动记录模 ...

  2. linux sed 空间模式,整理:SED的模式空间与缓冲区及n,N,d,D,p,P,h,H,g,G,x解析...

    sed命令n,N,d,D,p,P,h,H,g,G,x解析 1.sed执行模板=sed '模式{命令1;命令2}' 即逐行读入模式空间,执行命令,最后输出打印出来 2.p打印当前模式空间所有内容,追加到 ...

  3. ActiveRecord 模式杂谈

    ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性.配合遵循的命名和配置惯例,能够很大程度的快速实现模 ...

  4. Castle ActiveRecord(一)概述

    一.ActiveRecord与Castle ActiveRecord ActiveRecord是<Patterns of Enterprise Application Architecture& ...

  5. AppBox升级进行时 - 拥抱Entity Framework的Code First开发模式

    AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. 从Subsonic到Entity Framework Subsonic最早发布 ...

  6. 【学习笔记】ABAP OOD设计模式 - 桥接模式

    ABAP OOD设计模式 - 桥接模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 桥接模式又称为桥梁模式,在程序开发中,采用不同的维度分解一系列对象,然后采用组 ...

  7. 设计模式(五)--工厂模式汇总

    LZ想把简单工厂模式.工厂方法模式和抽象工厂模式整理到一篇博文当中,由浅入深,应该能方便理解和记忆,话不多说,进入正题. 一.简单工厂模式 定义:从设计模式的类型上来说,简单工厂模式是属于创建型模式, ...

  8. Spring Security Oauth2 之密码模式

    点击关注公众号,实用技术文章及时了解   作者:歪桃   blog.csdn.net/m0_37892044/article/details/113058924 前言,因为最近的项目是用Spring ...

  9. 第 5 章 MybatisPlus ActiveRecord

    第 5 章 MybatisPlus ActiveRecord 1.ActiveRecord 简介 ActiveRecord(活动记录) Active Record(活动记录 ),是一种领域模型模式,特 ...

最新文章

  1. phxpaxos编译示例
  2. 【 FPGA 】组合逻辑中的竞争与险象问题(五)
  3. vue获取dom元素注意问题
  4. 文本框换行_多行文本框的认识以及代码详解
  5. ACM常见问题之【求逆序对】
  6. 网络编程模型综述 之 成熟的IO框架介绍
  7. java概念,Java基础概念
  8. 【C语言重点难点精讲】C语言预处理
  9. 2041. 干草堆(前缀和差分)
  10. Redis分布式锁的概念
  11. 宇宙第一 IDE Visual Studio 支持 Java 了!
  12. Linux多任务编程(二)---fork()函数及其基础实验
  13. Win10开启Linux调试adb(从此告别虚拟机)
  14. 顺情说好话,耿直讨人嫌
  15. VMware下Hadoop 2.4.1完全分布式集群平台安装与设置
  16. 本机号码一键登录原理与应用
  17. Markdown绘制思维导图
  18. Spring事务(Transactions)的原理与实现
  19. js base64 php,php中的base64decode 与js中的互相转换
  20. Magento 1.4 EAV 属性中的新东西

热门文章

  1. mysql存储过程触发器游标_MySQL存储过程,触发器,游标
  2. java单例模式 uml_Java设计模式系列之单例模式
  3. python脚本加密_教你如何基于python实现脚本加密
  4. JS面向对象——Object.defineProperty
  5. Vue v-model 指令详解以及sync修饰符的使用场景(结合父子组件通信案例)
  6. LeetCode 756. 金字塔转换矩阵(回溯)
  7. LeetCode 1411. 给 N x 3 网格图涂色的方案数(数学)
  8. python多线程实现方式_python中实现多线程有几种方式?
  9. python concat_python-pd.concat()不合并在同一索引上
  10. java 资源锁定_如何在Java中创建时正确锁定资源