php 数据映射,PHP设计模式之:数据映射模式教程

本文介绍了PHP中的数据映射模式,通过一个实例展示了如何使用PDO实现数据库访问,并创建了一个数据映射类Table,以及一个具体的表映射类UserTable。通过这个模式,开发者可以更方便地组织应用程序与数据库的交互。虽然ORM框架如TP框架中的Model类能提高开发效率,但在SQL优化方面可能不如直接使用SQL。示例代码包括数据库连接、数据插入操作,演示了如何通过数据映射类进行数据库操作。
摘要由CSDN通过智能技术生成

php中的设计模式中有很多的各种模式了,在这里我们来为各位介绍一个不常用的数据映射模式吧,希望文章能够帮助到各位。

之前的几种设计模式,都是大大提高了PHP代码的可读性、可维护性。但是,在WEB应用中还有更重要的需求与挑战,那就是:数据库应用。可之前的设计模式,都没有涉及于此。今天写到的,数据映射模式就是能够更好的组织应用程序与数据库进行交互。

博主这两天也是花了点时间对,这种模式有了那么一点的了解。斗胆在这个里献丑,按照自己的理解,写一点东西与大家分享,互相学习。

当然说到数据映射模式,就不得不提到对象关系映射(Object Relational Mapping,简称ORM),用于实现面向对象编程语言里不同类型系统的数据之间的转换。一般ORM框架对付简单的应用系统来说都能满足基本需求,可以大大降低开发难度,提高开发效率,但是它在SQL优化方面,肯定是比纯SQL语言要差很多,对复杂关联、SQL内嵌表达式的处理都不是很理想。

对于博主目前使用的TP框架,其核心文件Model.class.php就是实现了ORM和ActiveRecords模式,在项目中所有的模型也都是继承这个模型类。

好吧,还是不丢人说这些废话了,自己参考编写整理了一份实例,给大家分享一下,互相交流。

首先我们需要一个数据库中间层实现类,使用pdo进行数据库访问。当然这个类不是今天的重点,我也是从网上拷来的,可以直接忽略。

创建一个DB类文件 Db.class.php

<?php /*   * 数据库中间层实现类   */  class Db {       public static $db = null;       private $_dbh = null;       public static function getInstance() {           if( self::$db == null ){               self::$db = new self(BACKEND_DBHOST ,BACKEND_DBUSER ,BACKEND_DBPW ,BACKEND_DBNAME);           }           return self::$db;       }         private function __construct( $host ,$user ,$pass ,$dbname ){           try {               $this->_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

<?php /**    * 数据映射类   * 部分代码来源TP框架   * 使用相关魔术方法 则映射的表修改字段后无需修改属性值   */   class Table{         // 数据信息      protected $data = array();         // 数据信息      protected $db = null;         // 表信息      protected $tableName = '';      public function __construct() {          $this->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

<?php /**    * 数据映射到表    * 一般根据表的结构由工具自动生成,比如Yii框架等。   */  class UserTable extends Table {       protected $tableName = 'user';  }  ?>     使用方式 index.php  <?php /**    * 数据库配置文件    */   define('BACKEND_DBHOST', 'localhost');   define('BACKEND_DBUSER', 'root');   define('BACKEND_DBPW', '');   define('BACKEND_DBNAME', 'test');   define('BACKEND_DBCHARSET', 'utf-8');  /*   * 这里实例化对象时可以使用之前介绍的工厂模式和注册模式,来实例化和管理实例化对象   * TP框架中的D方法就是做了这部分工作   */  $UserTable = new UserTable();  $UserTable->username = 'Anrai';  $UserTable->mobile = '123456789';  $UserTable->email = 'huanglei.web@gmail.com';  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  */  ?>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值