数据源架构模式之活动记录

一、概念

活动记录(Active Record):一个对象,它包装数据库表或视图中某一行,封装数据库访问,并在这些数据上增加了领域逻辑。

对象既有数据又有行为。活动记录使用直截了当的方法,把数据访问逻辑置于领域对象中。

二、实现简单活动记录

活动记录在php许多框架中都有应用,如cakephp。

Php代码  

  1. <?php
  2. /**
  3. * 行数据入口类
  4. */
  5. class OrderGateway {
  6. /*定义元数据映射*/
  7. private $_name;
  8. private $_id;
  9. public function __construct($id, $name) {
  10. $this->setId($id);
  11. $this->setName($name);
  12. }
  13. public function getName() {
  14. return $this->_name;
  15. }
  16. public function setName($name) {
  17. $this->_name = $name;
  18. }
  19. public function getId() {
  20. return $this->_id;
  21. }
  22. public function setId($id) {
  23. $this->_id = $id;
  24. }
  25. /**
  26. * 入口类自身拥有更新操作
  27. */
  28. public function update() {
  29. $data = array(‘id‘ => $this->_id, ‘name‘ => $this->_name);
  30. $sql = "UPDATE order SET ";
  31. foreach ($data as $field => $value) {
  32. $sql .= "`" . $field . "` = ‘" . $value . "‘,";
  33. }
  34. $sql = substr($sql, 0, -1);
  35. $sql .= " WHERE id = " . $this->_id;
  36. return DB::query($sql);
  37. }
  38. /**
  39. * 入口类自身拥有插入操作
  40. */
  41. public function insert() {
  42. $data = array(‘name‘ => $this->_name);
  43. $sql = "INSERT INTO order ";
  44. $sql .= "(`" . implode("`,`", array_keys($data)) . "`)";
  45. $sql .= " VALUES(‘" . implode("‘,‘", array_values($data)) . "‘)";
  46. return DB::query($sql);
  47. }
  48. public static function load($rs) {
  49. /* 此处可加上缓存 */
  50. return new OrderGateway($rs[‘id‘] ? $rs[‘id‘] : NULL, $rs[‘name‘]);
  51. }
  52. }
  53. /**
  54. * 上面内容与行数据入口一样
  55. * 此类为领域逻辑,这里新建个类,不采用static
  56. */
  57. class OrderAccess {
  58. public function find($id) {
  59. $sql = "SELECT * FROM order WHERE id = " . $id;
  60. $rs = DB::query($sql);
  61. return OrderGateway::load($rs);//这里返回的行对象
  62. }
  63. public function insert($data){
  64. OrderGateway::load($data)->insert();
  65. }
  66. public function updateName($id,$name){
  67. $rs = array(‘id‘ => $id,‘name‘ => $name);
  68. OrderGateway::load($rs)->update();
  69. }
  70. public function findAll() {
  71. $sql = "SELECT * FROM order";
  72. $rs = DB::query($sql);
  73. $result = array();
  74. if (is_array($rs)) {
  75. foreach ($rs as $row) {
  76. $result[] = OrderGateway::load($row);
  77. }
  78. }
  79. return $result;
  80. }
  81. }
  82. class DB {
  83. /**
  84. * 这只是一个执行SQL的演示方法
  85. * @param string $sql   需要执行的SQL
  86. */
  87. public static function query($sql) {
  88. echo "执行SQL: ", $sql, " <br />";
  89. }
  90. }
  91. /**
  92. * 客户端调用
  93. */
  94. class Client {
  95. public static function main() {
  96. header("Content-type:text/html; charset=utf-8");
  97. $access = new OrderAccess();
  98. $order = $access->find(1);
  99. echo $order->getName();
  100. $access->insert(array(‘name‘ => ‘xxxxx‘));
  101. $access->update(1,‘xxxxx‘);
  102. }
  103. }
  104. Client::main();
  105. ?>

三、运行机制

●活动记录的本质是一个领域模型,每条活动记录负责向数据库保存数据,从数据库加载数据以及处理作用于数据之上的领域逻辑。

●此模式没有隐藏关系数据库的存在这个事实,因此通常使用此模式的同时几乎不用其他对象关系映射模式。

●活动记录和行数据入口十分相似,之前也多次提及。行数据入口仅有数据库访问而活动记录既有数据源逻辑又有领域逻辑。

●由于活动记录和数据库间的紧耦合,在这个模式中常用静态查找方法(例子采用的是新建类,这样更便于测试)。

●活动记录通常具有如下方法:

1、由SQL结果集中的一行构造一个活动记录实例(例中的OrderAccess->find方法

2、为将来对表的插入构造一个新的实例

3、用静态查找方法来包装常用的SQL查询和返回活动记录(例子采用新建类)

4、更新数据库并将活动记录中的数据插入数据库(例中的OrderAccess->update方法)

5、获取和设置域(例中的OrderGateway getName setName方法)

6、实现部分业务逻辑

四、使用场景 

1、领域模型

活动记录适用于不太复杂的领域逻辑,如CRRD等。仅当活动记录对象和数据库中表直接对应,才比较有效。如果业务逻辑复杂,就会想到使用对象的直接关系、集合和继承等。它们都难以映射到活动记录。

2、事务脚本

活动记录可以减少事务脚本代码重复的痛苦。

3、表模块(不考虑)

数据源架构模式之活动记录

时间: 2024-10-18 19:18:37

数据源架构模式之活动记录的相关文章

数据源架构模式

Table Data Gateway 充当数据库表访问入口的对象.一个实例处理一个表中所有的行. 在应用逻辑中混杂SQL语句会引起问题. 表数据入口包含了用于访问单个表或者视图的所有SQL.其他代码调用它的方法来实现所有与数据库的交互. 运行机制 其用于数据读写,因此是无状态的. 每个方法都将输入参数映射为SQL调用并在数据库连接上执行该语句. 从查询返回信息 返回简单数据结构,如Map.缺点是破坏了编译时检查. 采用额外的数据传输对象. 使用时机 表数据入口同表模块可以很好地使用.它产生一个记

.NET应用架构设计—适当使用活动记录模式代替领域模型模式

阅读目录: 1.背景介绍 2.简单介绍领域模型模式.活动记录模式 3.活动记录模式的简单示例及要点 4.总结 1.背景介绍 对软件开发方法论有兴趣的博友应该发现最近"领域驱动设计"慢慢的被人发现被人实践起来,园子里也慢慢有了DDD的学习气氛和宝贵实战经验的分享.其实之前我也痴迷于DDD,为什么会痴迷于它并不是因为它是所谓的新技术,也不是因为各种对它的炒作,而是我觉得我找到了能解放我们进行企业业务系统开发的方法论. DDD可以很好的指导我们开发可靠的软件系统,尤其是现在的企业业务复杂多变

《企业应用架构模式中文版》学习笔记(转)

本书先介绍了一些企业应用开发的基础知识,比如分层架构.WEB表现.业务逻辑.数据库映射.并发.会话.分布策略等等.通过使用场景.解决方案.UML等手段详细介绍了设计模式(包括一些常用的设计模式GOF23和本书上新创的设计模式).了解书中这些模式是干什么的.它们解决什么问题.它们是如何解决问题的.这样,如果你碰到类似的问题,就可以从书中找到相应的模式.可以为你节约成本.缩短项目周期时间.避免风险,以确保项目能够完美的完成. 一.三个基本层次:表现层.领域层.数据源层 层次 职责 表现层 提供服务,

企业应用架构模式pdf

下载地址:网盘下载 内容简介  · · · · · · <企业应用架构模式>作者是当今面向对象软件开发的权威,他在一组专家级合作者的帮助下,将40多种经常出现的解决方案转化成模式,最终写成这本能够应用于任何一种企业应用平台的.关于解决方案的.不可或缺的手册.<企业应用架构模式>获得了2003年度美国软件开发杂志图书类的生产效率奖和读者选择奖.<企业应用架构模式>分为两大部分.第一部分是关于如何开发企业应用的简单介绍.第二部分是<企业应用架构模式>的主体,是关

企业应用架构模式 pdf下载

从大学到现在,这本书也许我反反复复地读了不下十遍,可是这次终于有了勇气把他标注为看过,因为直到今天我才自信自己真的理解了里面所讲的架构模式. 对于现在的互联网时代,所有的开发思想都是强调简洁,强调"敏捷",甚至曾经流行一时的OOD竟然有被嫌弃的趋势 需要学习的朋友可以通过网盘免费下载pdf版 (先点击普通下载-----再选择普通用户就能免费下载了)http://putpan.com/fs/fyibfens4hu6b61d5/ <企业应用架构模式>作者是当今面向对象软件开发的

架构模式数据源模式之:表数据入口(Table Data Gateway)、行数据入口(Row Data Gateway)、活动记录(Active Record)

一:表数据入口(Table Data Gateway) 表数据入口提供了用于访问单个表或者视图(也包含了联表查询)的所有SQL,通常一个表一个类.其它代码通过它来实现对数据库的交互.基于这个特点,表数据入口和事务脚本代码以及表模块结合的很好. 在查询时候,表数据接口可以返回数据集 或者 DTO 或者 DTO列表.在 事务脚本 代码中已经阐述过了 DTO 以及 DTO 的列表这种形式.但是使用 DTO 这种形式,带来的一个问题是:到处衍生的 DTO,那么,如何减少到处衍生的 DTO 的,见这里<>

《企业应用架构模式》 - 书摘精要

(译者序) "每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样,你就能一次又一次地使用该方案而不必做重复劳动." ---- Christopher Alexander 招式套路可以千变万化,扎实深厚的"内功"却是始终如一: (前言) 关于软件架构的通用性的书籍,我推荐[POSA] -- "面向模式的软件体系结构": 迭代开发的核心在于只要软件对用户有用,就应当交付,即使这个软件当时并没有完成: (引言) 大多数重

《企业应用架构模式》(POEAA)读书笔记

原文地址:<企业应用架构模式>(POEAA)读书笔记作者:邹齐龙(技术-5013 什么是架构 Rolph Johnson认为:架构是一种主观上的东西,是专家级的项目开发人员对系统设计的一些可共享的理解 架构中包括一些决定,开发者希望这些决定能尽早作出,因为在开发者看来它们是难以改变的. 如果你发现某些决定不像你想象中的那么难以改变,那么它就不再与架构相关 理解: B/S (SmartClient.C/S) 架构, DotNet 架构, J2EE架构 企业应用的特点 涉及到持久化数据 很多人同时

Hibernate(1)——数据访问层的架构模式&lt;转&gt;

数据库的概念.逻辑.数据模型概念 应用程序的分层体系结构发展 MVC设计模式与四层结构的对应关系 持久层的设计目标 数据映射器架构模式 JDBC的缺点 Hibernate简介 迅速使用Hibernate开发的例子 Hibernate的核心类和接口,以及他们的关系 POJO和JavaBean的比较 之前的一篇总结文章: 数据库精华知识点总结(1)—数据库的三层模式和二级映像,E-R(实体联系图)图,关系模型 简单来说,就是在软件开发领域,可以用模型表示真实世界的实体.针对数据库就分为: 概念模型(