数据对象映射简单地说就是利用操作对象来达到操作数据库的目的,这个不是指封装一个数据库类,然后操作这个数据库类来实现数据库操作。这里说的数据对象很特殊,一般和数据库中的表名相同,比如下面举的一个例子,数据库中一个book表,于是我创建一个book类,让这个book类和book表之间建立“映射”,这个映射怎么说呢,可以理解为,对这个book对象的操作都会作用到book表中,不用在更改book表的时候SQL语句,只需要在book类中写一个接口就行了。
下面是数据库中book表的接口
mysql> desc book; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | char(30) | NO | | NULL | | | isbn | char(20) | NO | | NULL | | | price | int(11) | NO | | 10 | | +-------+----------+------+-----+---------+----------------+
下面时book类的定义,以及模式的实现:
<?php
class Category{
//因为要让外部可以访问这个类的属性,所以要将属性设为public
public $id;
public $name;
public $isbn;
public $price;
private $pdo;
public function __construct(){
$this->pdo=new PDO("mysql:host=localhost;dbname=test","root","123456");
}
//增加一个接口,可以保存当前类数据到book表中
public function save(){
$this->pdo->exec("insert into book (id,name,isbn,price) values({$this->id},‘{$this->name}‘,‘{$this->isbn}‘,{$this->price})");
}
}
$category=new Category();
$category->id=1;
$category->name="php之道";
$category->isbn="666666";
$category->price=99;
//通过book类中的save方法就可以实现将这条数据插入到book表中。
$category->save();
?>
查看数据库的book表:
mysql> select * from book; +----+-----------+--------+-------+ | id | name | isbn | price | +----+-----------+--------+-------+ | 1 | php之道 | 666666 | 99 | +----+-----------+--------+-------+ 1 row in set (0.00 sec)
可以看到,再上面的测试部分,往数据库中插入数据的时候,并没有写SQL语句,当然这只是一个很简单的demo,可以增加其他的接口,比如实现删除,查找,更新,在进行这些操作之前,还写以写一个validation,以保证数据的合法性。
数据对象映射模式很常用,一些PHP的框架中就用到了,比如Yii框架的ActieRecord,明白这个思想和用法就OK了