참고: 이해가 안 되시면 읽지 마세요. 이 글은 Java에 대한 내용이 아니므로 Java를 좋아하시는 분들은 건너뛰셔도 됩니다.
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 테이블 모듈(고려하지 않음)