首页 > PHP 设计模式 笔记与总结(9)数据对象映射模式

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

 

转载于:https://www.cnblogs.com/dee0912/p/4483704.html

更多相关:

  • 开发环境使用phpstudy 编辑器用sublime 数据库navicat 需要下载composer 先配置好本地域名,然后需要我们将资源引入到项目里面 下载地址www.layui.com. layui框架有很多我们后台开发需要的控件,帮助我们高效完成后台搭建。 先创建我们的入口文件admins.php,接着我们在a...

  • php 如果在类中定义变量,在类的方法中调用时应该加上$this-> .     class ClassName {private $a = 333;function __construct(){$this->a = 2222;}public function bbb($value=''){echo $this->a;} } $b...

  • 今天我们来看UrlRule.php

  •     先吐为敬!   最近心血来潮研究nodejs如何完成微信支付功能,结果网上一搜索,一大堆“代码拷贝党”、“留一手”、“缺斤少两”、“不说人话”、“自己都没跑通还出来发blog”、“各种缺少依赖包”、“各种注释都没有”、“自己都不知道在写什么”的程序大神纷纷为了增加自己博客一个帖子的名额而发布了各种千奇百�...

  • 阅读ceph源码过程中需要明确当前操作是由哪个线程发出,此时需要根据线程id来确认线程名称 C++获取线程id是通过系统调用来直接获取 函数描述 头文件: 函数名称:syscall(SYS_gettid) 该函数直接返回了一个pid_t int类型的数字,即为当前线程id 此外函数pthread_s...

  • 面试题 分库分表之后,id 主键如何处理? 面试官心理分析 其实这是分库分表之后你必然要面对的一个问题,就是 id 咋生成?因为要是分成多个表之后,每个表都是从 1 开始累加,那肯定不对啊,需要一个全局唯一的 id 来支持。所以这都是你实际生产环境中必须考虑的问题。 面试题剖析 基于数据库的实现方案 数据库自增 id 这个就是说你的...

  • ORM操作    单表、一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models.CharField(max_length=32) 6 7 8 class UserInfo(m...

  • 建立如下表: 建表语句: class表创建语句 create table class(cid int not null auto_increment primary key, caption varchar(32) not null)engine=innodb default charset=utf8;student表创建语句 c...

  • 点云PCL免费知识星球,点云论文速读。文章:DSP-SLAM: Object Oriented SLAM with Deep Shape Priors作者:Jingwen Wang Martin Runz Lourdes Agapito编译:点云PCL代码:https://github.com/JingwenWang95/DSP-S...

  • RAM缓存 新RAM缓存算法(CLFUS) 新的RAM缓存使用的创意来自许多缓存替换策略和算法,包括LRU,LFU,CLOCK,GDFS及2Q,它被命名为时钟周期内最小频繁使用大小算法CLFUS(Clocked Least Frequently Used by Size)。它避开了任何专利算法,具有如下特性: 均衡最近性(Rec...

  • MP4 |视频:AVC,1280×720 30 fps |音频:AAC,48 KHz,2 Ch |时长:2h 12m 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:560M C4D是一个有抱负的运动图形艺术家和设计师的重要工具。借助C4D,您可以使用3D对象、动态效果和动画来增强运动图形、模型和可视化效果。本课...

  • 文章目录先说问题:再说解决尝试1:尝试2(该尝试建议先在自己环境搭配对应业务测试通过后再现场尝试): 感谢 学无止境996同学的陪伴和vigourtyy美丽女友的支持,直到这个解决问题的深夜 先说问题: ceph 12.2.1生产环境:3副本 tier + 3副本data 机房在拥有业务的情况下重启集群交换机,产生如下场景...

  • 这周主要学习了java中的类和对象的知识点,发现和C++中的类和对象极为相似,对于类和对象的概念理解起来也简单。同时在自学的过程中也把类的知识重新复习巩固了一下(如类的三大特征:继承,封装和多态,构造,成员对象的访问权限,构造,无参有参函数的调用等),同时也了解到一些新的概念,比如类对象创建和引用占据堆内存和栈内存,输出对象时默认调...