ActiveRecord模式整理

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中必检异常有哪些_Java面试题经典面试题220道(附答案)

Java基础:1.JDK 和 JRE 有什么区别?2. 和 equals 的区别是什么? 解读3. 两个对象的 hashCode() 相同, 那么 equals() 也一定为 true吗?4. final 在 Java 中有什么作用?5. Java 中的 Math. round(-1. 5) 等…

11项关键先进制造技术解读!

来源:中国指挥与控制学会图片:来源于网络上届美国总统奥巴马非常重视制造业。其发起成立的“先进制造业合作委员会”,Advanced Manufacturing Partnership,就未来制造业的发展做出了展望,重点规划11个技术领域&#xf…

网站程序数据库怎么上传到服务器上,网站的数据库怎么上传到服务器

网站的数据库怎么上传到服务器 内容精选换一换通常在将数据导入数据库前,即将入库的数据已经在相关主机上了。我们称这种保存着待入库数据的服务器为数据服务器。此时,只需检测以确认数据服务器和GaussDB(for openGauss)集群能够正常通信,并查…

知道接口地址 如何传数据_数据不知道如何可视化?一款工具推荐给大家

之前我们介绍过 Python 里面的一些数据分析和可视化工具,比如 Pandas、Modin、Dash 等。今天要介绍一款标星 12.1K 的数据可视化工具 bokeh,优雅、简洁、高性能的交互式可视化库,同时支持大数据量和流式数据。其中 PyPI 和 Conda 每月安装超过…

(六)Spark-Eclipse开发环境WordCount-JavaPython版Spark

Spark-Eclipse开发环境WordCount 视频教程: 1、优酷 2、YouTube 安装eclipse 解压eclipse-jee-mars-2-win32-x86_64.zip JavaWordcount 解压spark-2.0.0-bin-hadoop2.6.tgz 创建 Java Project-->Spark 将spark-2.0.0-bin-hadoop2.6下的jars里面的jar全部复制到Sp…

c# 从一组数中随机抽取一定个数_Python随机模块22个函数详解

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也会用到。random模块,用于生成伪随机数,之所以称之为伪随…

读书人:人机融合中的深度态势感知

雅典学院(拉斐尔)来源:人机与认知实验室“你现在的气质里,藏着你走过的路,读过的书和爱过的人。"— 电影《卡萨布兰卡》里的一句话《追问人工智能》--刘伟 - 读书人视频如下:https://www.bilibili.com…

python时间序列进行线性插值_Python pandas时间序列插值日期时间数据

这似乎有效.可能有点清理代码.但是你得到了它的要点 from datetime import datetime import pandas as pd import time #Create data df pd.DataFrame({ interval : [0.782296, 0.795469, 0.821426, 0.834957, 0.864383, 0.906240], datetime : [datetime(2012, 11, 19, 12, 4…

根据id 隐藏_明星ID价值四位数?吃鸡玩家崩溃:打工一个月工资还没名称值钱...

01你知道吗?和平精英游戏名称也很值钱?——最近,有这样一条消息出现在了我的面前,某和平精英角色明星名称的价格居然被捧到了千元之上,对,各位没有看错,虽然只是一个普普通通的游戏名称&#xf…

范式变革与规律涌现:世界科技发展新趋势

来源:学习时报新科技革命与产业变革持续展开,以人工智能为代表的新兴使能技术驶入“快车道”,世界科技创新被认为正在进入“认知革命”的阶段——对生命过程的“精微刻画与操作”和对人类智能的“逆向工程与强化”。趋势特征从“大停滞”迈向…

Unity5和WebGL移植指南的一些总结

对于手游开发者来说,更新版本往往意味着非常复杂的过程,你需要根据反馈做更新、测试、提交然后等待审核,而由于不需要客户端依赖,页游往往是快速测试游戏版本的最佳途径,很多人可能都知道Unity 5可以再不用Unity Web P…

java indexof方法_【3-14】Java中集合类list的增删改查

Hello,大家好,我是大家最亲爱的siki老师,每天都会在这里为大家带来一个Java语法中有趣的知识点,Q群175158287,欢迎同大家多多交流哈!今天给大家带来的是Java中list类的使用,java.util 包提供了l…

清华大学孙富春教授:基于知识智能的机器人技能学习

来源:学术通在刚结束的2019中国人工智能产业年会分论坛——“知识智能及其产业应用论坛”上,清华大学计算机科学与技术系教授、中国人工智能学会副理事长、国家杰青孙富春教授发表了题为《基于知识智能的机器人技能学习》的报告。孙富春教授报告聚焦人工…

图书管理系统可行性分析报告范例_会做可行性分析报告贺州专家团队*金

金兰8564ertyu-03会做可行性分析报告贺州专家团队*金不满意全额,三年内免费提供修改服务,目前,金兰企划已为上万家客户及伙伴提供了专业、精准的商业策划服务,并得到了客户及行业的一致好评。会做可行性分析报告贺州专家团队*金金…

java开发项目实例_Alibaba内部出品Java突击手册,大量开发实战项目分享

前言Java作为目前最受欢迎的语言,每年都会有很多转行、跨行等等地人加入到开发大军中来,但是Java开发也是会遇到瓶颈的,当我们遇到瓶颈的时候就会去寻求发展突破,尤其是从Java开发高级工程师向架构师迈进的时候,需要大…

快递下单后取消订单_网约车定位地点不动,男子别的平台下单,没取消订单要付6.6元...

众所周知,在平台上网约车的时候,要是超出一定时间放鸽子,通常都是要扣除乘客部分钱,反之是司机取消了订单,平台同样会给司机处罚,在路程近的单子上,有些司机是接了后就不想跑,但是也…

SQL基础--同义词

同义词的概念: 同义词是Oracle对象的别名,使用同义词访问相同的对象 可以为表、视图、存储过程、函数或另一同义词等对象创建同义词 方便访问其它用户的对象,隐藏了对象的身份 缩短对象名字的长度 同义词创建语法: CREATE [PUBLIC…

5G概述和基本原理

来源:电子万花筒 未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测;开展互联网&am…

以下选项中python用于异常处理结构_《Python 程序设计》复习题

目录 填空题 一、基础知识 二、序列 三、选择结构与循环结构和函数及面向对象、文件 选择题 一、Python 基础语法 二、基本数据类型 三、程序的控制结构 四、函数和代码复用 五、组合数据类型 六、面向对象: 七、文件 判断题 一、基础知识 二、序列 三、选择结构与循…

去掉边框_安卓也有堪比 VOUN 的加边框应用了,素材丰富到没朋友

iOS 系统中有一款可以给照片加边框的应用 VOUN,里面的相框档次很高,调整后的效果也很不错,但是安卓却没有一款类似的应用。开发者 Joey 尝试找了很多款相似的应用,结果不是广告就是骗流量的辣鸡应用,所以最后独自开发了…