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

来源:互联网 发布:dnf客户端源码 编辑:程序博客网 时间:2024/06/06 10:01

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

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

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

 

一、概念

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

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

 

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

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

Php代码  收藏代码
  1. <?php  
  2. class DB {  
  3.     /** 
  4.      * 这只是一个执行SQL的演示方法 
  5.      * 
  6.      * @param string  $sql 需要执行的SQL 
  7.      */  
  8.     public function query( $sql ) {  
  9.         echo "执行SQL: "$sql" <br />";  
  10.         return 1;  
  11.     }  
  12. }  
  13.   
  14. /** 
  15.  * order表的表数据入口 
  16.  */  
  17. class OrderGateway extends DB {  
  18.   
  19.     /** 
  20.      * 查询所有指令 
  21.      * 
  22.      * @return <type> 
  23.      */  
  24.     public function findAll() {  
  25.         $sql = "SELECT * FROM order";  
  26.         return DB::query( $sql );  
  27.     }  
  28.   
  29.     /** 
  30.      * 根据名字查找指令 
  31.      * 
  32.      * @param string  $name 
  33.      * @return bool 
  34.      */  
  35.     public function findByName( $name ) {  
  36.         $sql = "SELECT * FROM order WHERE `name` = '" . $name . "'";  
  37.         return DB::query( $sql );  
  38.     }  
  39.   
  40.     /** 
  41.      * 更新指令数据 
  42.      * 
  43.      * @param string  $key  关键字 
  44.      * @param array   $data 需要更新的数据 
  45.      */  
  46.     public function update( $id$data ) {  
  47.         if ( emptyempty$id ) || !is_array$data ) ) {  
  48.             return FALSE;  
  49.         }  
  50.   
  51.         $sql = "UPDATE order SET ";  
  52.         foreach ( $data as $field => $value ) {  
  53.             $sql .= "`" . $field . "` = '" . $value . "',";  
  54.         }  
  55.         $sql = substr$sql, 0, -1 );  
  56.   
  57.         $sql .= " WHERE id = " . $id;  
  58.   
  59.         return DB::query( $sql );  
  60.     }  
  61.   
  62.     /** 
  63.      * 插入指令的数据 
  64.      * 
  65.      * @param array   $data 需要写入的数据 
  66.      */  
  67.     public function insert( $data ) {  
  68.         if ( !is_array$data ) ) {  
  69.             return FALSE;  
  70.         }  
  71.   
  72.         $sql = "INSERT INTO order ";  
  73.         $sql .= "(`" . implode( "`,`"array_keys$data ) ) . "`)";  
  74.         $sql .= " VALUES('" . implode( "','"array_values$data ) ) . "')";  
  75.   
  76.         return DB::query( $sql );  
  77.     }  
  78.   
  79. }  
  80.   
  81. /** 
  82.  * 客户端调用 
  83.  */  
  84. class Client {  
  85.     public static function main() {  
  86.         $order = new OrderGateway();  
  87.   
  88.         header( "Content-type:text/html; charset=utf-8" );  
  89.         $data = array'order' => 'start');  
  90.         $order->insert( $data );  
  91.   
  92.         $id = 1;  
  93.         $data['id'] = $id;  
  94.         $order->update( $id$data );  
  95.   
  96.         $order->findAll();  
  97.   
  98.         $order->findByName( 'start' );  
  99.     }  
  100. }  
  101.   
  102. Client::main();  
  103.   
  104. ?>  

 

 

三、运行机制

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

 

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

 

 

四、使用场景

 

4.1表模块

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

 

4.2事务脚本

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

 

4.3领域模型

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

原创粉丝点击