当前位置:首页 > php > 正文内容

DAL、DAO、ORM、Active Record详解

phpmianshi6年前 (2015-03-30)php455
模型 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快速开发。


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

理解PHP中的Generator

PHP中Generator,似乎是在5.5版中引入了。PHP中的协程必须依赖于Generator来实现,所以我觉得有必要先专门写一篇文章介绍Generator。Generator这个单词在这里对应的中...

php中preg_match_all只能匹配100000字节的限制

背景用preg_match_all匹配时,偶尔会匹配失败,只能匹配到一部分符合的数据,代码如下://获取html文本中的a标签,然后获取 标签 <>之间的内容 fun...

PHP内核分析之源码目录结构 (二)

一、目录概览以php-7.4.1为例,目录多达十多个,下面介绍主要目录。├── build   linux下编译相关的目录├── ext      P...

PHP数组实际占用内存大小的分析

1.数组正常的赋值是不会发生内存改变的,但是当赋值的新数组发生改动的时候,php就会新开辟内存给新的数组,这里会造成无谓的内存消耗。最好是不要直接这样赋值,如果非赋值不可的话,记得加上‘&’符...

php中global与$GLOBAL由引用产生的区别

很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然。根据官方的解释是$GLOBALS['var'] 是外部的全局变量$var本身。global $var 是外部...

结构体对齐

书里给了一段代码,假如有个结构体如下:struct test {    char a;    int b;    long c; ...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。