zoukankan      html  css  js  c++  java
  • PHP 设计模式 笔记与总结(9)数据对象映射模式

    【数据对象映射模式】

    是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。例如在代码中 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 '<meta http-equiv="content-type" content="text/html;charset=utf8">';
     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,访问入口文件,则数据库的数据被修改

  • 相关阅读:
    [JAVA] 冻结Excel的第一行或第一列
    [SoapUI] 比较两个不同环境下的XML Response, 从外部文件读取允许的偏差值,输出结果到文本文件
    [Study] 通过游戏学编程的网站
    [SoapUI] SoapUI+Groovy中"org.apache.xmlbeans.XmlException: error:
    [SoapUI] 通过Groovy写文本文件
    [SoapUI] context.expand 和 groovyUtils.getXmlHolder 有什么不一样
    Codeforces Round #355 (Div. 2) C 预处理
    Codeforces Round #355 (Div. 2) B
    Codeforces Round #355 (Div. 2) A
    Codeforces Round #324 (Div. 2) D
  • 原文地址:https://www.cnblogs.com/dee0912/p/4483704.html
Copyright © 2011-2022 走看看