PHP 设计模式 笔记与总结(9)数据对象映射模式
【数据对象映射模式】
是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作。例如在代码中 new 一个对象,使用数据对象映射模式就可以将对象的一些操作比如设置一些属性,就会自动保存到数据库,跟数据库中表的一条记录对应起来。
【代码实现】
在代码中实现数据对象映射模式,我们将实现一个 ORM(对象关系映射 Object Relational Mapping) 类,将复杂的 SQL 语句映射成对象属性的操作。同时结合【工厂模式】和【注册模式】使用。
【例1】
数据库 test ,user 表结构:
CREATE TABLE `user` (
`id` int() NOT NULL AUTO_INCREMENT,
`name` varchar() CHARACTER SET utf8 DEFAULT NULL,
`mobile` varchar() CHARACTER SET utf8 DEFAULT NULL,
`regtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=latin1;

Common\User.php:
<?php
namespace Common; class User{
public $id;
public $name;
public $mobile;
public $regtime; protected $db; //构造方法
function __construct($id) {
$this->db = new Database\MySQLi();
$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");
}
}
Common\Databases\MySQLi.php
<?php
namespace Common\Database;
use Common\IDatabase; 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
define('BASEDIR',__DIR__); //定义根目录常量
include BASEDIR.'/Common/Loader.php';
spl_autoload_register('\\Common\\Loader::autoload');
echo '<meta http-equiv="content-type" content="text/html;charset=utf8">'; /*
* 对对象属性的操作就完成了对数据库的操作
*/
$user = new Common\User(); //读取数据
var_dump($user->id, $user->mobile, $user->name, $user->regtime);exit(); $user->mobile = '';
$user->name = 'Arshavin';
$user->regtime = date("Y-m-d H:i:s",time());
line 13 输出(原始表中的数据):
string '' (length=)
string '' (length=)
string 'K6' (length=)
string '2015-05-07 00:16:12' (length=)
注释 line 13,访问入口文件,则数据库的数据被修改

PHP 设计模式 笔记与总结(9)数据对象映射模式的更多相关文章
- PHP 设计模式 笔记与总结(10)数据对象映射模式 2
[例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...
- PHP设计模式笔记六:数据对象映射模式 -- Rango韩老师 http://www.imooc.com/learn/236
数据对象映射模式 1.数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作 2.在代码中实现数据对象映射模式,我们将实现一个ORM类,将复杂的SQL语句映射成对象属性 ...
- php设计模式 数据对象映射模式
数据对象映射模式,是将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作. 在代码中实现数据对象映射模式,实现一个ORM类,将复杂的sql语句映射成对象属性的操作.对象关系映射(Obje ...
- ASP.NET MVC 模型和数据对象映射实践
在使用 MVC 开发项目的过程中遇到了个问题,就是模型和数据实体之间的如何快捷的转换?是不是可以像 Entity Framework 的那样 EntityTypeConfiguration,或者只需要 ...
- .NetCore学习笔记:四、AutoMapper对象映射
什么是AutoMapper?AutoMapper是一个简单的小型库,用于解决一个看似复杂的问题 - 摆脱将一个对象映射到另一个对象的代码.这种类型的代码是相当沉闷和无聊的写,所以为什么不发明一个工具来 ...
- Python学习笔记_Chapter 6定制数据对象
1. 有用的BIF a. 判断字符串中是否包含子字符串 if s_a in s_b: b. pop() 描述:从指定的列表位置删除并返回一个数据项. (sarah_name,sarah_dob)=l_ ...
- Emit学习(4) - Dapper解析之数据对象映射(二)
承接着上一篇, 这一篇主要以堆栈的方式来演示一下, db数据转换到类中去的一个过程. 一.先看第一张图 程序在运行到176行(上一篇贴出的代码)的时候, 就会出现上图中的第一个栈. 那在此之前, Da ...
- Emit学习(4) - Dapper解析之数据对象映射(一)
感觉好久没有写博客了, 这几天有点小忙, 接下来会更忙, 索性就先写一篇吧. 后面估计会有更长的一段时间不会更新博客了. 废话不多说, 先上菜. 一.示例 1. 先建类, 类的名称与读取的表名并没有什 ...
- PHP 设计模式 笔记与总结(8)策略模式
① 策略模式,将一组特定的行为和算法封装成类,以适应某些特定的上下文环境,这种模式就是策略模式. ② 实际应用举例,假如一个电商网站系统,针对男性女性用户要各自跳转到不同的商品类目,并且所有广告位展示 ...
随机推荐
- Android之jni深入
小技巧:自动生成 java本地方法对应的c代码的方法名 javah 指令 +全类名 java1.6版本 class C:\workspace\HelloWorldFromC2\bin\classes ...
- 防止黑客对服务器IP地址的攻击
下面的参数都是系统默认的: [root@ok etc]# cat /proc/sys/net/ipv4/conf/eth0/accept_source_route [root@ok etc]# cat ...
- Kafka学习笔记(一):概念介绍
Kafka是一个开源的,分布式的,高吞吐量的消息系统.随着Kafka的版本迭代,日趋成熟.大家对它的使用也逐步从日志系统衍生到其他关键业务领域.特别是其超高吞吐量的特性,在互联网领域,使用越来越广泛, ...
- angularjs教程
http://www.runoob.com/angularjs/angularjs-routing.htmlA
- Linux snmp监控
http://blog.csdn.net/apple_llb/article/details/50494787 http://www.ttlsa.com/monitor/snmp-oid/
- Maven跳过test打包
1. cd到当前目录 2. mvn install -Dmaven.test.skip=true 参考:http://blog.csdn.net/symgdwyh/article/details/ ...
- Android的四大组件
Android的四大组件:Activity.Service.BroadcastReceiver.Content Provider. Content Provider 属于Android应用程序的组件之 ...
- sqlserver日常维护脚本
SQL code --备份declare @sql varchar(8000) set @sql='backup database mis to disk=''d:\databack\mis\mis' ...
- SQL事务用法begin tran,commit tran和rollback tran的用法
Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务. begin tran表示开始事务, commit tran表示提交 ...
- linux根分区扩容
Linux 根分区扩容 1.fdisk –l (红线部分为新添加的硬盘) 2.磁盘格式化 3. mkfs.ext3 -T largefile /dev/sde(格式化上面的分区) 4. vgdisp ...