zoukankan      html  css  js  c++  java
  • php设计模式 -- 数据映射模式

    1、模式定义

    在了解数据映射模式之前,先了解下数据映射,它是在持久化数据存储层(通常是关系型数据库)和驻于内存的数据表现层之间进行双向数据传输的数据访问层。

    数据映射模式的目的是让持久化数据存储层、驻于内存的数据表现层、以及数据映射本身三者相互独立、互不依赖。这个数据访问层由一个或多个映射器(或者数据访问对象)组成,用于实现数据传输。通用的数据访问层可以处理不同的实体类型,而专用的则处理一个或几个。

    数据映射模式的核心在于它的数据模型遵循单一职责原则(Single Responsibility Principle), 这也是和 Active Record 模式的不同之处。最典型的数据映射模式例子就是数据库 ORM 模型 (Object Relational Mapper)。

    :将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数据库,跟数据库中表的一条记录对应起来。

    【例1】

    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

    <?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,访问入口文件,则数据库的数据被修改

  • 相关阅读:
    Netty之ProtoBuf(六)
    Netty对WebSocket的支持(五)
    Netty之心跳检测技术(四)
    Netty之多用户的聊天室(三)
    Docker Compose 笔记
    vue.js学习笔记
    powerdesigner 生成C#code 实体 模板设备
    .net 接收post 的参数 加载xml
    powerdesigner 生成实体代码 附加生成xml
    PostgreSql 获取所有的表、视图、字段、 主键
  • 原文地址:https://www.cnblogs.com/mmmzh/p/10101993.html
Copyright © 2011-2022 走看看