注意: この記事は Java 愛好家向けではありませんので、理解できない場合は読まないでください。
1. 概念
行データ ゲートウェイ: データ ソース内の単一レコードのエントリ ポイントとして機能するオブジェクトで、行ごとに 1 つのインスタンスがあります。
2. 行データ入力の簡単な実装
理解を容易にするために、最初に簡単に実装してみましょう:
<?php /** * 行数据入口类 */ class OrderGateway { /*定义元数据映射*/ private $_name; private $_id; public function __construct($id, $name) { $this->setId($id); $this->setName($name); } public function getName() { return $this->_name; } public function setName($name) { $this->_name = $name; } public function getId() { return $this->_id; } public function setId($id) { $this->_id = $id; } /** * 入口类自身拥有更新操作 */ public function update() { $data = array('id' => $this->_id, 'name' => $this->_name); $sql = "UPDATE order SET "; foreach ($data as $field => $value) { $sql .= "`" . $field . "` = '" . $value . "',"; } $sql = substr($sql, 0, -1); $sql .= " WHERE id = " . $this->_id; return DB::query($sql); } /** * 入口类自身拥有插入操作 */ public function insert() { $data = array('name' => $this->_name); $sql = "INSERT INTO order "; $sql .= "(`" . implode("`,`", array_keys($data)) . "`)"; $sql .= " VALUES('" . implode("','", array_values($data)) . "')"; return DB::query($sql); } public static function load($rs) { /* 此处可加上缓存 */ return new OrderGateway($rs['id'] ? $rs['id'] : NULL, $rs['name']); } } /** * 为了从数据库中读取信息,设置独立的OrderFinder娄。 */ class OrderFinder { public function find($id) { $sql = "SELECT * FROM order WHERE id = " . $id; $rs = DB::query($sql); return OrderGateway::load($rs);//这里返回的行对象 } public function findAll() { $sql = "SELECT * FROM order"; $rs = DB::query($sql); $result = array(); if (is_array($rs)) { foreach ($rs as $row) { $result[] = OrderGateway::load($row); } } return $result; } } class DB { /** * 这只是一个执行SQL的演示方法 * @param string $sql 需要执行的SQL */ public static function query($sql) { echo "执行SQL: ", $sql, " <br />"; } } /** * 客户端调用 */ class Client { public static function main() { header("Content-type:text/html; charset=utf-8"); /* 写入示例 */ $data = array('name' => 'start'); $order = OrderGateway::load($data); $order->insert(); /* 更新示例 */ $data = array('id' => 1, 'name' => 'stop'); $order = OrderGateway::load($data); $order->setName('xxxxxx'); $order->update(); /* 查询示例 */ $finder = new OrderFinder(); $order = $finder->find(1); echo $order->getName(); } } Client::main(); ?>
3. 動作メカニズム
● 行データ入力は、単一のレコードによく似たオブジェクトです。このオブジェクト、ドメインのデータベース内の各列。
●行データ入力では通常、データソースタイプからメモリ内タイプへのあらゆる変換が可能になります。
●行データエントリにドメインロジックが存在しない場合、それはアクティブなレコードです。
●例のように、データベースから情報を読み取るために、独立した OrderFinder クラスを設定します。もちろん、新しいクラスを作成せずに静的検索メソッドを使用することもできますが、データ ソースごとに異なる検索メソッドを必要とするポリモーフィズムはサポートされません。したがって、ここでは検索メソッドのオブジェクトを個別に設定するのが最善です。
●行データ入力はテーブルだけでなくビューでも使用できます。注意が必要なのはビューの更新操作です。
● 自動作成プロセス中にすべてのデータベース アクセス コードが自動的に生成されるように、コード内に「メタデータ マッピングの定義」を表示することをお勧めします。
4. 使用シナリオ
4.1 トランザクション スクリプト
はデータベース アクセス コードを適切に分離でき、さまざまなトランザクション スクリプトで簡単に再利用できます。ただし、ビジネス ロジックが複数のスクリプトで繰り返される場合があり、このロジックは行データの入力に役立つ場合があります。このロジックを継続的に移動すると、行データ エントリがアクティブなレコードに進化し、ビジネス ロジックの重複が削減されます。
4.2 ドメイン モデル
データベースの構造を変更したいが、ドメイン ロジックは変更したくない場合は、行データ エントリを使用するのが良い選択です。ほとんどの場合、データ マッパーはドメイン モデルにより適しています。
行データ エントリはデータ マッパーと併用できます。これは少し冗長に思えるかもしれませんが、このアプローチは行データ エントリがメタデータから自動的に生成され、データ マッパーが手動で実装される場合に効果的です。
4.3 テーブルモジュール (考慮されていません)