`

数据源架构模式之表数据入口

阅读更多

数据源架构模式有四种:表数据之口,行数据入口,活动记录和数据映射器。

在了解它们之前,需对领域模型模式有一定的了解,可先参看

业务逻辑层之事务脚本与领域模型业务逻辑层之表模块

 

一、概念

表数据入口(Table Data Gateway):充当数据库表访问入口的对象。一个实例处理表中所有的行(有没有想起表模块)。

表数据入口包含了用于访问单个表或视图的所有SQL,如CRUD等,其他代码调用它的方法来实现所有与数据库的交互。

 

二、实现简单的表数据入口

为方便理解,先给出事例,后面根据事例再作详细的分析。

<?php
class DB {
    /**
     * 这只是一个执行SQL的演示方法
     *
     * @param string  $sql 需要执行的SQL
     */
    public function query( $sql ) {
        echo "执行SQL: ", $sql, " <br />";
        return 1;
    }
}

/**
 * order表的表数据入口
 */
class OrderGateway extends DB {

    /**
     * 查询所有指令
     *
     * @return <type>
     */
    public function findAll() {
        $sql = "SELECT * FROM order";
        return DB::query( $sql );
    }

    /**
     * 根据名字查找指令
     *
     * @param string  $name
     * @return bool
     */
    public function findByName( $name ) {
        $sql = "SELECT * FROM order WHERE `name` = '" . $name . "'";
        return DB::query( $sql );
    }

    /**
     * 更新指令数据
     *
     * @param string  $key  关键字
     * @param array   $data 需要更新的数据
     */
    public function update( $id, $data ) {
        if ( empty( $id ) || !is_array( $data ) ) {
            return FALSE;
        }

        $sql = "UPDATE order SET ";
        foreach ( $data as $field => $value ) {
            $sql .= "`" . $field . "` = '" . $value . "',";
        }
        $sql = substr( $sql, 0, -1 );

        $sql .= " WHERE id = " . $id;

        return DB::query( $sql );
    }

    /**
     * 插入指令的数据
     *
     * @param array   $data 需要写入的数据
     */
    public function insert( $data ) {
        if ( !is_array( $data ) ) {
            return FALSE;
        }

        $sql = "INSERT INTO order ";
        $sql .= "(`" . implode( "`,`", array_keys( $data ) ) . "`)";
        $sql .= " VALUES('" . implode( "','", array_values( $data ) ) . "')";

        return DB::query( $sql );
    }

}

/**
 * 客户端调用
 */
class Client {
    public static function main() {
        $order = new OrderGateway();

        header( "Content-type:text/html; charset=utf-8" );
        $data = array( 'order' => 'start');
        $order->insert( $data );

        $id = 1;
        $data['id'] = $id;
        $order->update( $id, $data );

        $order->findAll();

        $order->findByName( 'start' );
    }
}

Client::main();

?>

 

 

三、运行机制

由事例可以看出表数据入口接口其实很简单,一般包括几个从数据库中获取数据的查找方法以及更新、插入和删除方法,每个方法都将输入参数映射为一个SQL调用并在数据库连接上执行该语句。

 

从事例查询数据接口可以看到,每个查询都会返回多个数据项,php是允许返回多数据项的,可以把这些项作为一个单行使用,但如果只能返回一个单值,多次查询才能返回多行。这种情况可以采用数据传输对象。

 

 

四、使用场景

 

4.1表模块

表数据入口产生一个记录集数据结构由表模块处理。表模块最好的数据映射就是表数据入口了。

 

4.2事务脚本

表数据入口特别适用于事务脚本。二者之间的选择归结于如何处理多数据行。对PHP而言这个不是什么问题,对于之前提到有些语言不允许返回多数据项的,可以采用数据传输对象,不过这显然比表数据入口麻烦。

 

4.3领域模型

通常这两者很少一起使用,可以用表数据入口返回适当的领域对象,问题是这样会使领域对象和入口这间存在双向依赖。相反,数据映射器更好地分离了领域模型和数据库。

 

3
2
分享到:
评论

相关推荐

    PHP数据源架构模式之表入口模式实例分析

    主要介绍了PHP数据源架构模式之表入口模式,结合实例形式分析了PHP表入口模式的相关概念、原理、使用方法及操作注意事项,需要的朋友可以参考下

    C#三层架构经典源代码

    在一个典型的三层架构应用程序中,应用程序的用户工作站包括提供图形用户界面(GUI)的程序设计和具体的应用程序入口表格或交互式窗口。 事务逻辑处在局域网(LAN)服务器或其他共享主机上,它作为...

    ASP.NET3.5典型模块开发源代码

    18.4.3 用编程方式实现报表与数据源的关联 234 18.5 小结 235 第19章 PDF文档处理模块 236 19.1 PDF文档介绍 236 19.2 数据表格与PDF的格式转换 237 19.2.1 第三方组件“iTextSharp”的调用 237 19.2.2...

    ThinkPHP 3.1.2 - PHP的开发框架MVC - 含Core,Extend,Example

    而且引入了全新的CBD(核心+行为+驱动)架构模式,旨在打造DIY框架 和AOP编程体验,让ThinkPHP能够在不同方面都能快速满足项目和应用的需求, 并且正式引入SAE、REST和Mongo支持。 使用ThinkPHP,你可以更方便和...

    clean-arquitecture-sucursal

    基础项目实施清洁架构 在开始之前 我们将从解释项目的不同组件开始,从...驱动适配器代表我们系统外部的实现,例如与休息服务,肥皂,数据库,读取平面文件的连接,尤其是必须与之交互的任何源和数据源。 入口点 入口

    windows驱动开发技术详解-part2

     2.2.1 Windows操作系统总体架构  2.2.2 应用程序与Win32子系统  2.2.3 其他环境子系统  2.2.4 Native API  2.2.5 系统服务  2.2.6 执行程序组件  2.2.7 驱动程序  2.2.8 内核  2.2.9 硬件抽象层 ...

    Windows驱动开发技术详解的光盘-part1

     2.2.1 Windows操作系统总体架构  2.2.2 应用程序与Win32子系统  2.2.3 其他环境子系统  2.2.4 Native API  2.2.5 系统服务  2.2.6 执行程序组件  2.2.7 驱动程序  2.2.8 内核  2.2.9 硬件抽象层 ...

    Visual.C#2010从入门到精通

    16.2.6 使用SQLBrowseConnect连接数据源 325 16.2.7 准备并执行SQL操作 327 16.2.8 获取结果集 327 16.2.9 断开数据源连接并释放环境句柄 329 16.3 使用ODBC API实现通讯录 329 16.3.1 数据库设计 329 16.3.2 添加...

    智能办公解决方案.pptx

    基础定位功能 位置地图功能 (地图缩放拖拽多地图切换,截图和查看详情) 实时轨迹显示 (任意标签实时追踪模式,标准电量监视 低电量提示) 组织架构管理 (按姓名 标签ID 部门多维度联想搜索,图形化查找) 增值...

    C#微软培训资料

    第七章 表 达 式 .58 7.1 操 作 符 .58 7.2 算术操作符和算术表达式.59 7.3 赋值操作符和赋值表达式.64 7.4 关系操作符和关系表达式.65 &lt;&lt;page 2&gt;&gt; page begin==================== 7.5 逻辑操作符和...

    SQL注入攻击与防御(安全技术经典译丛)

     4.6 枚举数据库模式  4.6.1 SQL Server  4.6.2 MySQL  4.6.3 Oracle  4.7 提升权限  4.7.1 SQL Server  4.7.2 Oracle  4.8 窃取哈希口令  4.8.1 SQL Server  4.8.2 MySQL  4.8.3 Oracle  ...

    Windows内核安全与驱动开发光盘源码

    12.5.3 文件加密表的数据结构与初始化 269 12.5.4 文件加密表的操作:查询 270 12.5.5 文件加密表的操作:添加 271 12.5.6 文件加密表的操作:删除 272 12.6 文件打开处理 273 12.6.1 直接发送IRP进行查询与...

    Windows内核安全驱动开发(随书光盘)

    12.5.3 文件加密表的数据结构与初始化 269 12.5.4 文件加密表的操作:查询 270 12.5.5 文件加密表的操作:添加 271 12.5.6 文件加密表的操作:删除 272 12.6 文件打开处理 273 12.6.1 直接发送IRP进行查询与...

    个人集成平台

    嘿嘿,这样就是我为啥给大家看这个系统的结构图,而不是代码的原因,在后面会附上这个项目的源代码,如果对大家有用的话,大家可以拿去看看。 集成方法  (1). MEF框架  MEF框架应该是微软在.net 4.0中推出的一...

    phpcms2008_gbk

    Phpcms 采用模块化方式开发,功能强大灵活易于扩展,并且完全开放源代码,面向大中型站点提供重量级网站建设解决方案。3年来,凭借Phpcms团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,...

Global site tag (gtag.js) - Google Analytics