数据源架构模式之表数据入口
数据源架构模式之表数据入口
【表数据入口的意图】
充当到数据库表的入口的对象。一个实例处理表中的所有行。
表数据入口包含了用于访问单个表或视图的所有SQL,如CRUD等。其它的代码调用它的方法来实现所有与数据库的交互。
【表数据入口的适用场景】
1、表数据入口可以同表模块一起使用。
2、适用于事务脚本处理
【表数据入口的运行机制】
表数据入口的实现非常简单,一般会包括几个从数据库中获取数据的查找方法以及更新,插入和删除方法。
每个方法都将输入参数映射为一个SQL调用并在数据库连接上执行该语句。
【表数据入口的优点和缺点】
1、简单。表数据入口可能是使用起来最简单的数据库接口模式。
2、为数据源的精确访问逻辑提供了一种自然的方法。
3、相同的接口即可以用于SQL操作操作数据库,又可以用于存储过程。
【表数据入口的PHP示例】
*/
public function findAll() {
$sql = "SELECT * FROM person";
return DB::query($sql);
}
/**
* 根据名字查找人员数据
* @param $name
* @return
*/
public function findByName($name) {
$sql = "SELECT * FROM person WHERE `name` = '" . $name . "'";
return DB::query($sql);
}
/**
* 更新人员数据
* @param $key 关键字
* @param $data 需要更新的数据, 例如:$data = array('id' => 1, 'name' => 'Martin', 'birthday' => '');
*/
public function update($id, $data) {
if (empty($id) || !is_array($data)) {
return FALSE;
}
$sql = "UPDATE person SET ";
foreach ($data as $field => $value) {
$sql .= "`" . $field . "` = '" . $value . "',";
}
$sql = substr($sql, 0, -1);
$sql .= " WHERE id = " . $id;
return DB::query($sql);
}
/**
* 插入人员的数据
* @param $data 需要写入的数据, 例如:$data = array('name' => 'Martin', 'birthday' => '');
*/
public function insert($data) {
if (!is_array($data)) {
return FALSE;
}
$sql = "INSERT INTO person ";
$sql .= "(`" . implode("`,`", array_keys($data)) . "`)";
$sql .= " VALUES('" . implode("','", array_values($data)) . "')";
return DB::query($sql);
}
}
class DB {
/**
* 这只是一个执行SQL的演示方法
* @param string $sql 需要执行的SQL
*/
public static function query($sql) {
echo "执行SQL: ", $sql, "
";
}
}
/**
* 客户端调用
*/
class Client {
/**
* Main program.
*/
public static function main() {
$person = new PersonGateway();
header("Content-type:text/html; charset=utf-8");
$data = array('name' => 'Martin', 'birthday' => '2010-09-15');
$person->insert($data);
$id = 1;
$data['id'] = $id;
$person->update($id, $data);
$person->findAll();
$person->findByName('Martin');
}
}
Client::main();
?>
如上所示代码仅为一个演示版本
然而这个演示版本有一些可以优化的地方,如:将更新和插入的SQL拼装过程可以提取出来等。
数据表接口是一个很简单的数据源模式,这在我们平常的工作中也有用到,有可能看起来与上面的例子相差较大,但是可能只是将某些方法进行了优化而已,究其本质是一样的。