【数据对象映射模式】
是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数据库,跟数据库中表的一条记录对应起来。
【代码实现】
在代码中实现数据对象映射模式,我们将实现一个 ORM(对象关系映射 Object Relational Mapping) 类,将复杂的 SQL 语句映射成对象属性的操作。同时结合【工厂模式】和【注册模式】使用。
【例1】
数据库 test ,user 表结构:
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(32) CHARACTER SET utf8 DEFAULT NULL,`mobile` varchar(11) CHARACTER SET utf8 DEFAULT NULL,`regtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
CommonUser.php:
php namespace Common;class User{public $id;public $name;public $mobile;public $regtime;protected $db;//构造方法function __construct($id) {$this->db = new DatabaseMySQLi();$conn = $this->db->connect('127.0.0.1', 'root', '', 'test');$res = $this->db->query("select * from user where id = { $id} limit 1");$data = $res->fetch_assoc();$this->id = $data['id'];$this->name = $data['name'];$this->mobile = $data['mobile'];$this->regtime = $data['regtime'];}//析构方法function __destruct() {$this->db->query("update user set name = '{ $this->name}', mobile = '{ $this->mobile}', regtime = '{ $this->regtime}' where id = { $this->id} limit 1");} }
CommonDatabasesMySQLi.php
php namespace CommonDatabase; use CommonIDatabase;class MySQLi implements IDatabase{protected $conn;function connect($host, $user, $passwd, $dbname){$conn = mysqli_connect($host, $user, $passwd ,$dbname);$this->conn = $conn;}function query($sql){$res = mysqli_query($this->conn, $sql);return $res;}function close(){mysqli_close($this->conn);} }
入口文件 index.php
1 php 2 define('BASEDIR',__DIR__); //定义根目录常量 3 include BASEDIR.'/Common/Loader.php'; 4 spl_autoload_register('\Common\Loader::autoload'); 5 echo ''; 6 7 /* 8 * 对对象属性的操作就完成了对数据库的操作 9 */ 10 $user = new CommonUser(1); 11 12 //读取数据 13 var_dump($user->id, $user->mobile, $user->name, $user->regtime);exit(); 14 15 $user->mobile = '13800138000'; 16 $user->name = 'Arshavin'; 17 $user->regtime = date("Y-m-d H:i:s",time());
line 13 输出(原始表中的数据):
string '1' (length=1) string '10086' (length=5) string 'K6' (length=2) string '2015-05-07 00:16:12' (length=19)
注释 line 13,访问入口文件,则数据库的数据被修改