数据对象映射简单地说就是利用操作对象来达到操作数据库的目的,这个不是指封装一个数据库类,然后操作这个数据库类来实现数据库操作。这里说的数据对象很特殊,一般和数据库中的表名相同,比如下面举的一个例子,数据库中一个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了