DAL、DAO、ORM、Active Record辨析

转自:http://blog.csdn.net/suiye/article/details/7824943

模型 Model

模型是MVC中的概念,指的是读取数据和改变数据的操作(业务逻辑)。一开始我们直接把和数据库相关的代码放在模型里(sql直接写在代码中),这样就会导致以后的维护相当麻烦。业务逻辑的修改都需要开发者重新写sql,如果项目需要分库,需要将sql语句抽出来,放到单独的一层。这一层就是DAL(数据访问层)。

持久层Persistence

持久层只是一个逻辑概念而已,主要任务是负责把数据保存起来,一般是指保存至数据库或者文件,也可以负责完成与之相关的行为。

持久层指的是把数据长期保存起来,如数据库把数据长期保存在硬盘里,XML也可以长期保存数据,还有如果把数据存放到指定文件中,也可以成为持久层。

持久化可以理解为动词。Java中的Hibernate做的就是持久化的操作,主要是对数据库底层的OR映射,这样我们就不必关心讨厌的关系映射了,直接操作对象就可以了。

DAL  Data Access Layer,数据访问层

DAL是三层架构(表现层,业务逻辑层,数据访问层)中的数据访问层,是一个概念或者说是一个方案,它由许多DAO组成,或者说由DAO具体实现,是把和数据库相关的代码封装起来,这样当我们执行分库时,便只用调整DAO的代码了,模型根本不用关心它使用的数据是放在A库还是B库。

设计数据访问层接口的目的是让业务逻辑层不去调用具体的数据访问层的实现(不依赖于数据访问层具体的实现技术),这样的好处是,业务逻辑不必管数据访问层具体是什么技术来实现的,接口是不变的。

使用DAL的优势如下:

1、开发人员可以只关注整个结构中的其中某一层;

2、可以很容易的用新的实现来替换原有层次的实现;

3、可以降低层与层之间的依赖;

4、有利于标准化;

5、利于各层逻辑的复用。

概括来说,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义。

降低耦合性的实际应用如下:

业务逻辑不必管数据访问层具体是什么技术来实现的,接口是不变的,数据访问层可以用jdbc来实现,也可以用hibernate来实现,而且更换起来不是非常麻烦,这样耦合就降低了

DAO data access object,数据访问对象

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

顾名思义就是与数据库打交道,夹在业务逻辑与数据库资源中间,是DAL的具体实现。

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

ORM object-relational mapping,对象关系映射

ORM也是一种对数据库访问的封装,然而ORM不像DAO只是一种软件设计的指导原则,强调的是系统应该层次分明,更像是一种工具,有着成熟的产品,比如JAVA界非常有名的Hibernate,以及很多PHP框架里自带的ORM库。他们的好处在于能将你程序中的数据对象自动地转化为关系型数据库中对应的表和列,数据对象间的引用也可以通过这个工具转化为表之间的JOIN。使用ORM的好处就是使得你的开发几乎不用接触到SQL语句。创建一张表,声明一个对应的类,然后你就只用和这个类的实例进行交互了,至于这个对象里的数据该怎么存储又该怎么获取,通通不用关心。

Active Record

Active Record则是随着ruby on rails的流行而火起来的一种ORM模式,它是把负责持久化的代码也集成到数据对象中,即这个数据对象知道怎样把自己存到数据库里。这与以往的ORM有不同,传统的ORM会把数据对象和负责持久化的代码分开,数据对象只是一个单纯包含数据的结构体,在模型层和ORM层中传递。而在Active Record中,模型层集成了ORM的功能,他们既代表实体,包含业务逻辑,又是数据对象,并负责把自己存储到数据库中,当然,存储的这一部分代码是早已在模型的父类中实现好了的,属于框架的一部分,模型只需简单的调用父类的方法来完成持久化而已。

下面内容摘自ThinkPHP手册

遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。

ActiveRecord的主要思想是:

1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field;

2. ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;

3. ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑;

ActiveRecord比较适用于:

1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时, ActiveRecord是非常方便的,即你的业务逻辑大多数是对单表操作;

2. 当发生跨表的操作时, 往往会配合使用事务脚本(Transaction Script),把跨表事务提升到事务脚本中;

3. ActiveRecord最大优点是简单, 直观。 一个类就包括了数据访问和业务逻辑. 如果配合代码生成器使用就更方便了;

这些优点使ActiveRecord特别适合WEB快速开发。

时间: 2024-10-26 00:21:23

DAL、DAO、ORM、Active Record辨析的相关文章

Yii2 数据库Active Record(ORM)

ACTIVE RECORD(ORM) 参考:http://www.yiiframework.com/doc-2.0/guide-db-active-record.html namespace app\models; use yii\db\ActiveRecord; class Customer extends ActiveRecord { const STATUS_ACTIVE = 'active'; const STATUS_DELETED = 'deleted'; public static

Active Record (AR) 类及实现

Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术. 每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 AR 类中体现为类的属性,一个 AR 实例则表示表中的一行. 常见的 CRUD 操作作为 AR 的方法实现.因此,我们可以以一种更加面向对象的方式访问数据. 例如,我们可以使用以下代码向 tbl_post 表中插入一个新行. yii 表单验证规则 <?php classContactFormextendsCFormModel { public$_

YII Active Record 详细解说

Active Record 虽然 Yii DAO 可以处理几乎任何数据库相关的任务, 但很可能我们会花费 90% 的时间以编写一些执行普通 CRUD(create, read, update 和 delete)操作的 SQL 语句. 而且我们的代码中混杂了SQL语句时也会变得难以维护.要解决这些问题,我们可以使用 Active Record. Active Record (AR) 是一个流行的 对象-关系映射 (ORM) 技术. 每个 AR 类代表一个数据表(或视图),数据表(或视图)的列在 A

Yii的学习(4)--Active Record

摘自Yii官网:http://www.yiiframework.com/doc/guide/1.1/zh_cn/database.ar 在官网原文的基础上添加了CDbCriteria的详细用法. 虽然 Yii DAO 可以处理几乎任何数据库相关的任务, 但很可能我们会花费 90% 的时间以编写一些执行普通 CRUD(create, read, update 和 delete)操作的 SQL 语句. 而且我们的代码中混杂了SQL语句时也会变得难以维护.要解决这些问题,我们可以使用 Active R

Yii Active Record 动态数据表

Active Record(AR)是一种流行的 对象-关系映射(ORM)技术,其映射关系为 AR class:数据表 AR class property:数据表的一列 AR 实例:数据表的一条数据 所以对于常用的数据库操作(CRUD)可以转化成一种面向对象的数据操作形式. 实现一个AR类的的最简代码如下: class Post extends CActiveRecord { public static function model($className=__CLASS__) { return p

业务逻辑层-Active Record

Active Record(活动记录模式),当系统中的业务和数据库中的表存在一一对应关系的时候,可用采用. Active Record模式的特点:每个业务对象代表数据表中的一行数据,并且业务对象还包括了数据的增删改查的方法. ORM 一般这种模式采用一种ORM框架,即对象关系映射.这里用的的映射是:Dapper(开源轻量级,高效率,白自动化),Dapper需要我们写sql语法,所有是半自动化. 案例 内容管理系统中一博客系统 可以发布博客 对博客进行评论 code 代码下载 对象实体 publi

架构模式中的Active Record和Data Mapper

架构模式中的Active Record和Data Mapper 概念 在简单应用中,领域模型是一种和数据库结构一致的简单结构,对应每个数据库表都有一个领域类,在这种情况下,有必要让每个对象负责数据库的存取过程,这也就是Active Record(活动记录). 领域对象直接鱼数据库表进行交互,这带来了一个问题,随着领域逻辑变的更加复杂,它就慢慢转变成一个大的领域模型,简单的Active Record已经不能满足要求了. 领域类和表一对一匹配也开始随着把领域逻辑放入更小的类而失效.关系数据库无法处理

yii 数据库 Active Record

// 查找满足指定条件的结果中的第一行 $post=Post::model()->find($condition,$params); // 查找具有指定主键值的那一行 $post=Post::model()->findByPk($postID,$condition,$params); // 查找具有指定属性值的行 $post=Post::model()->findByAttributes($attributes,$condition,$params); // 通过指定的 SQL 语句查找

Yii1.1 Active Record 查询结果转化成数组

使用Yii 的Active Record 来获取查询结果的时候,返回的结果集是一个对象类型的,有时候为了数据处理的方便希望能够转成数组返回.比如下面的方法: <?php // 查找满足指定条件的结果中的第一行 $post=Post::model()->find($condition,$params); // 查找具有指定主键值的那一行 $post=Post::model()->findByPk($postID,$condition,$params); // 查找具有指定属性值的行 $po