当前位置: 首页 > 编程日记 > 正文

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;

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

 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 Common\User(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

相关文章:

inet_pton和inet_ntop函数

Linux下这2个IP地址转换函数&#xff0c;可以在将IP地址在“点分十进制”和“整数”之间转换 而且&#xff0c;inet_pton和inet_ntop这2个函数能够处理ipv4和ipv6。算是比较新的函数了。 inet_pton函数原型如下[将“点分十进制” &#xff0d;> “整数”] #include <sys/…

Firefox3 RC1颁布各种新特征发扬阐发更平定

作者: Dailon 出自: http://www.linuxdiyf.com Mozilla项目曾经颁布了Firefox 3 RC1。Firefox 3的新特征包罗对Javascript 1.8的支持、DOM和HTML的转变、微技俩&#xff08;microformats&#xff09;支持及一个扩展的Canvass完成。 Mozilla公司颠末对Javascript 1.8特征…

java中判断两个字符(或者字符串相等)

string a,b;//两字符串 在java中判断两个字符&#xff08;字符串&#xff09;相等&#xff0c;用a.equals(b); if(a.equals(b)){ //如果相等&#xff0c;返回值为true }else{ //如果不相等&#xff0c;返回值为false } 不能用if(ab)来进行判断,这里比较的是两数据的内存

初学Hadoop之图解MapReduce与WordCount示例分析

Hadoop的框架最核心的设计就是&#xff1a;HDFS和MapReduce。HDFS为海量的数据提供了存储&#xff0c;MapReduce则为海量的数据提供了计算。HDFS是Google File System&#xff08;GFS&#xff09;的开源实现&#xff0c;MapReduce是Google MapReduce的开源实现。HDFS和MapReduc…

cnblogs不愧为cnblogs

在cnblogs落脚3天了&#xff0c;写了一些很实践的文章&#xff0c;很有成就感&#xff0c;为什么&#xff1f;我第一次为是否发表这篇文章而作出思考&#xff0c;以前在别的地方&#xff0c;总是转别人的文章居多&#xff0c;到了cnblogs&#xff0c;感受到了原创的精神——即使…

Debian刊行版3晋级到4

作者: rincess 出自: http://www.linuxdiyf.com 前些天把供职器从Debian 3 sarge晋级到Debian 4 etch&#xff0c;经过议定考察这几天的运转浮现&#xff0c;感受非常满意。新的体系包孕了新的WWW供职器Apache 2.2和PHP 5.2.0&#xff0c;SVN也从1.1晋级到了1.4&#xff0c;Tr…

简单五子棋问题,java实现

**题目要求&#xff1a;**实现一个控制台下五子棋的程序。用一个二维数组模拟一个15*15路的五子棋棋盘&#xff0c;把每个元素赋值位“┼”可以画出棋盘&#xff0c; “○”代表该交叉点下了一颗白棋子&#xff0c;“●”代表该交叉点下了一颗黑棋子。每次用户输入要下棋的坐标…

Singleton 单例模板

1 // singleton.h2 3 #ifndef SINGLETON_H4 #define SINGLETON_H5 6 // 单例基类模板7 template <class T>8 class Singleton9 { 10 public: 11 static T& give_me() 12 { 13 static T s_inst; 14 return s_inst; 15 } 16 17 private: …

Oracle 7.3.4 for OpenServer 5 装配

起原&#xff1a;网海拾贝 1.建立oracle用户、dba组&#xff1b;2.调整系统中央参数&#xff1a;#./idtune SHMMAX 409600000#./idtune SEMMNI 153.装配SCO补丁文件 oss459A&#xff0c;重新毗连中央并重新启动&#xff1a;#/etc/conf/cf.d/link_unix -y#init 6   4.编纂oracl…

sql server中的hash应用优化

sql server很多地方用到hash&#xff0c;计划缓存查找&#xff0c;hash连接&#xff0c;hash聚合等。 hash查找mssql很多设计中都应用了&#xff0c;不过我们能在开发设计中&#xff0c;也可以利用这个特性。 将如果有需求对大文本进行完全匹配&#xff0c;比如查找产品型号&am…

JAVA猴子选大王问题

题目要求 猴子选大王。输入猴子的个数n&#xff0c;所有的猴子从1-n编号排成一圈&#xff0c;从1号猴子开始数数&#xff0c;数到3的倍数猴子被淘汰&#xff0c;最后剩下的是大王。输出是大王的猴子的编号&#xff08;提示&#xff1a;使用数组&#xff0c;每个数组元素相当于一…

POJ 1185 炮兵阵地 (状压DP)

炮兵阵地Time Limit: 2000MS Memory Limit: 65536KTotal Submissions: 14869 Accepted: 5575Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成&#xff0c;地图的每一格可能是山地&#xff08;用"H" 表示&#xff09;…

不雅测发挥分析Android在美智能机市场凌驾黑莓及苹果

网易科技讯 3月4日动静&#xff0c;根据尼尔森公司比来宣布的陈诉发挥分析&#xff0c;Android操纵体系以29%的市占率在美国智好手机市场凌驾黑莓(27%)和苹果(27%)。其中&#xff0c;宏达电占12%&#xff0c;摩托罗拉占10%&#xff0c;三星占5%。但从厂商角度来看&#xff0c;苹…

Java基础-常量,变量,成员变量,局部变量

在java中&#xff0c;数据是以常量和变量两种方法形式进行存储和表示的&#xff08;实际上&#xff0c;所有程序的数据都是这两种形式&#xff09;。 变量 变量代表程序的状态。程序通过改变变量的值来改变整个程序的状态&#xff0c;或者说得更大一些&#xff0c;也就是实现程…

把eclipse从英文调整为中文

鼠标右键单击桌面上的快捷方式&#xff0c;选择文件所在位置 选择配置设置 eclipse.ini 在最后加上 -Duser.languageen 然后重启eclipse即可

关系数据理论中的范式

标准化表示从你的数据存储中移去数据冗余(redundancy)的过程。如果数据库设计达到了完全的标准化&#xff0c;则把所有的表通过关键字连接在一起时&#xff0c;不会出现任何数据的复本(repetition)。标准化的优点是明显的&#xff0c;它避免了数据冗余&#xff0c;自然就节省了…

无法在证书存储区中找到清单签名证书的解决办法

以前的一个项目今天打开忽然提示说“无法在证书存储区中找到清单签名证书”&#xff0c;很郁闷&#xff0c;不知道怎么回事。最好在 工程属性里面&#xff0d;&#xff0d;签名&#xff0d;&#xff0d;为Clickonce清单签名 去掉 。再次生成居然成功了。不知道具体什么原因引起…

Linux Centos 上一些常用的命令

1、查看端口被哪个进程占用 netstat -lnp | grep <端口号> 2、查看某个进程号详细信息 ps <进程号> 3、检查指定服务是否开启&#xff08;例如 telnet&#xff09; chkconfig --list | grep telnet chkconfig iptables on &#xff08;打开某个服务器自启动&#…

eclipse提示在***类中找不到main方法

可能是因为注释加的太多了&#xff0c;在代码最开始的时候 这时候&#xff0c;把注释删掉就可以了 就像这样&#xff0c;这时候不要惊慌&#xff0c;先看一下是不是注释太多了&#xff0c;如果不是的话&#xff0c;请百度搜索解决办法

【随记】动态调用web服务

通常我们在程序中需要调用WebService时&#xff0c;都是通过“添加Web引用”&#xff0c;让VS.NET环境来为我们生成服务代理&#xff0c;然后调用对应的Web服务。这样是使工作简单了&#xff0c;但是却和提供Web服务的URL、方法名、参数绑定在一起了&#xff0c;这是VS.NET自动…

在博客中加入“花絮”效果

在博客中加入Snap Shots Snap Shots表示“花絮”的意思&#xff0c;在博客中可以使用Snap Shots来添加“花絮”效果。先演示一遍效果&#xff0c;看是否能用&#xff1a;http://www.cnblogs.com/psunny内部的链接Snap Shots效果不可用 http://www.google.cn外部的链接Snap Shot…

phonegap调用摄像头

phonegap的HTML5的代码 是通用的 自己写了个 可是发现 在安卓机上市可以实现拍照的 但是iOS上却不行 这是为什么 我一直不解 document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { document.addEventListener(&quo…

关于JDBC中的 PreparedStatement 的使用讲解

**关于JDBC中的 PreparedStatement 的使用讲解**TOC 文章转载于博客 https://www.cnblogs.com/ysw-go/p/5459330.html 如有侵权&#xff0c;联系删除

SQLite数据转换成sql server数据

需要将SQLite数据库里的数据导入到SQL Server&#xff0c;在网上搜了好久&#xff0c;没有找到一个方便实用的方法。 经过本人的细心琢磨实验&#xff0c;终于让我给找到一好的方法&#xff1a;使用CSV文件作为介质来做转换。现在记录下来&#xff0c;一是小小庆祝一下&#xf…

Animation Override Controller动画重载器

假设游戏有很多个小人, 每一个人有2种动画站立,跑. 在通常情况下每一个人物都需要一个动画控制器。 有没有想过定义一个动画控制器 无须在定义全新的动画充值器实现每一个小人都播放自己的动画呢&#xff1f;没错Animation Oveeride Controller就是来解决这个问题的 1. 我们设…

java连接mysql8的坑

变化&#xff1a; 1.Class.forName(“com.mysql.cj.jdbc.Driver”); 2.connDriverManager.getConnection(“jdbc:mysql://localhost/数据库名字?serverTimezoneUTC”,“root”,“密码”); package chap01;import java.sql.Connection; import java.sql.DriverManager; import…

Oracle用户管理

创建用户create user–概述&#xff1a;在oracle中要创建一个新的用户使用 create user 语句,一般是具有dba(数据库管理员)的权限才能使用。–基本语法&#xff1a;create user 用户名 identified by 密码create user dbuser1 identified by dbuser1; 用户赋权grant–概述&…

UNIX网络编程--ioctl操作(十七)

一、概述 在本书中有两个地方都对这个函数进行了介绍&#xff0c;其实还有很多地方需要这个函数。ioclt函数传统上一直作为纳西而不适合归入其他精细定义类别的特性的系统接口。网络程序&#xff08;特别是服务器程序&#xff09;经常在程序启动执行后使用ioctl获取所在主机全部…

Servlert接口的doGet()、doPst()方法

Serlvet接口只定义了一个服务方法就是service&#xff0c;而HttpServlet类实现了该方法并且要求调用下列的方法之一&#xff1a; doGet&#xff1a;处理GET请求 doPost&#xff1a;处理POST请求 当发出客户端请求的时候&#xff0c;调用service 方法并传递一个请求和响应对象&a…

Web服务器 之 Apache 2.x 服务器中的URL重写的配置和应用

作者&#xff1a;北南南北来自&#xff1a;LinuxSir.Org摘要&#xff1a; 本文是关于Apache 2.x 服务器中的URL别名规则的文档&#xff0c;它是通过rewrite模块来实现的。能过URL别名规则&#xff0c;我们能看到一个干净的URL&#xff0c;比如可以重写为类似静态网页的地址。比…