之前的几种设计模式,都是大大提高了PHP代码的可读性、可维护性。但是,在WEB应用中还有更重要的需求与挑战,那就是:数据库应用。可之前的设计模式,都没有涉及于此。今天写到的,数据映射模式就是能够更好的组织应用程序与数据库进行交互。
博主这两天也是花了点时间对,这种模式有了那么一点的了解。斗胆在这个里献丑,按照自己的理解,写一点东西与大家分享,互相学习。
当然说到数据映射模式,就不得不提到对象关系映射(Object Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统的数据之间的转换。一般ORM框架对付简单的应用系统来说都能满足基本需求,可以大大降低开发难度,提高开发效率,但是它在SQL优化方面,肯定是比纯SQL语言要差很多,对复杂关联、SQL内嵌表达式的处理都不是很理想。
对于博主目前使用的TP框架,其核心文件Model.class.php就是实现了ORM和ActiveRecords模式,在项目中所有的模型也都是继承这个模型类。
好吧,还是不丢人说这些废话了,自己参考编写整理了一份实例,给大家分享一下,互相交流。
首先我们需要一个数据库中间层实现类,使用pdo进行数据库访问。当然这个类不是今天的重点,我也是从网上拷来的,可以直接忽略。
创建一个DB类文件 Db.class.php
_dbh = new PDO('mysql:dbname='.$dbname.';host='.$host,$user,$pass); $this->_dbh->query('SET NAMES '. BACKEND_DBCHARSET); $this->_dbh->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $this->_dbh->setAttribute(PDO::ATTR_ERRMODE, true); } catch (PDOException $e) { throw new Exception('Can not connect db'); } } public function getOne($sql){ try { $rs = $this->_dbh->query($sql); $result = $rs->fetch(PDO::FETCH_ASSOC); if(!empty($result)) { return $result; } } catch (PDOException $e) { throw new Exception($this->_dbh->errorInfo()); } return false; } public function getAll($sql){ try { $rs = $this->_dbh->query($sql); $result = $rs->fetchAll(PDO::FETCH_ASSOC); if(!empty($result)) { return $result; } } catch (PDOException $e) { throw new Exception($this->_dbh->errorInfo()); } return false; } public function exec($sql){ try { $exec = $this->_dbh->exec($sql); } catch (PDOException $e){ throw new Exception($this->_dbh->errorInfo()); } return $exec; } public function getLastId() { return $this->_dbh->lastInsertId(); } } ?>
数据映射类 Table.class.php
db = Db::getInstance(); } /** * 设置数据对象的值 */ public function __set($name,$value) { // 设置数据对象属性 $this->data[$name] = $value; } /** * 获取数据对象的值 */ public function __get($name) { return isset($this->data[$name])?$this->data[$name]:null; } /* * 添加 * 修改、删除也和添加类似,就不一一列举了 */ public function add() { $data = $this->data; foreach($data as $k=>$v) { $fieldArr[] = $k; $valueArr[] = "'".$v."'"; } $fields = implode(',', $fieldArr); $values = implode(',', $valueArr); $sql = 'INSERT INTO '.$this->tableName.' ('.$fields.') VALUES ('.$values.')'; $result = $this->db->exec($sql); if($result) { return $this->db->getLastId(); } else { return false; } } } ?>
表对应的类文件 UserTable.class.php
使用方式 index.php username = 'Anrai'; $UserTable->mobile = '123456789'; $UserTable->email = '[email protected]'; echo $UserTable->add(); /* 数据表sql CREATE TABLE `user` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(30) NOT NULL, `mobile` varchar(11) NOT NULL DEFAULT '0', `email` varchar(60) NOT NULL DEFAULT '0', PRIMARY KEY (`uid`), KEY `username` (`username`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 */ ?>