对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。

ORM提供了所有SQL语句的生成,代码人员远离了数据库概念。从一个概念需求(例如一个HQL)映射为一个SQL语句,并不需要什么代价,连1%的性能损失都没有。真正的性能损失在映射过程中,更具体地讲,是在对象实例化的过程中。

目前PHP 开源比较有名的 ORM 有以下几个:

1、Propel

Propel是一个适用于PHP5的ORM映射(Object Relational Mapping)框架,它基于Apache Torque提供对象持久层支持。它通过XML格式的模式定义文件和相应的配置文件来生成SQL和类,它允许你使用对象代替SQL来读写数据库表中的记录。Propel提供一个生成器来为你的数据模型创建SQL定义文件和PHP类。开发者也可以十分简单的定制生成的类,我们还可以通过XML, PHP类和Phing构建工具把Propel集成到已有的应用开发框架中去.例如PHP框架symfony的1.2以前的版本就是默认使用了精简版的Propel作为默认ORM框架。

官方网站:http://www.propelorm.org/

2、Doctrine

Doctrine是一个PHP的ORM框架,它必须运行在>=php5.2.3版本上,它是一个功能强大的数据抽象层。

它的一个主要特征就是使用面向对象的方式来实现数据库查询的封转,它底层通过一个类似 Hibernate HQL的DQL的查询语句进行数据库查询,这使得开发的灵活性更强,大大减小了重复代码。相比Propel,Doctrine的优点在于它支持支持全文检索,Doctrine的文档一直就比Propel要全面丰富,社区更活跃,而且使用起来更加自然、更易阅读、更接近原生SQL。性能方面也略微优于Propel。同样你也可以可以很方便的把Doctrine集成到现有的应用框架中去,比如PHP框架symfony的1.3以后的版本将Doctrine作为默认的ORM框架,同时也可以将Doctrine和Codeigniter整合起来。

官方网站: http://www.doctrine-project.org/

3、EZPDO

EZPDO是一个十分轻量级的PHP ORM框架。EZPDO的作者的本意旨在降低复杂的ORM学习曲线,尽可能在ORM的运行效率和功能之间做一个平衡点,它是我至今用过的最简单的ORM框架,我目前还想将它集成到我的CoolPHP SDK中来,而且运行效率相当不错,功能也基本能满足需求,只不过ESPDO的更新比较缓慢。

官方网站:http://www.ezpdo.net/blog/?p=2

4、RedBean

RedBean是一个易于使用,轻量级PHP ORM框架,提供对MySQL, SQLite&PostgreSQL的支持。RedBean架构非常灵活,核心也非常简约,开发者可以很方便的通过插件来扩展功能。

官方网站:http://www.redbeanphp.com/

5、其他

国内的fleaphp开发框架基于TableDataGateway实现ORM实现;Zend Framework除了提供对 SQL 语句的封装以外,也同样实现了TableGateway、TableRowSet、TableRow的实现;还有一些类似Rails的ActiveRecord实现的解决方案。

总的来说,一般ORM框架对付简单的应用系统来说都能满足基本需求,可以大大降低开发难度,提高开发效率,但是它在SQL优化方面,肯定是比纯SQL语言要差一些,对复杂关联、SQL内嵌表达式的处理可能不是很理想。也许这主要是由于PHP本身对象持久化的问题,导致ORM效率过低,普遍比纯SQL要慢。但是这些都是有办法解决的,最基本的解决性能的方案,我们可以通过缓存来提高效率,Hibernate来说,虽然配置比较繁杂,但是它通过灵活的使用二级缓存和查询缓存极大的缓解数据库的查询压力,极大的提升了系统的性能。

如果你想自己实现一个PHP的ORM,下面的可以参考下:

001

002

abstract class Model{

003

protected $pk ='id';

004

protected $_ID = null;

005

protected $_tableName;

006

protected $_arRelationMap;

007

protected $_modifyMap;

008

protected $is_load = false;

009

protected $_blForDeletion;

010

protected $_DB;

011

012

public function __consturct($id = null){

013

$this->_DB = mysql_connect('127.0.0.1','root','') ;

014

$this->_tableName =$this->getTableName();

015

$this->_arRelationMap =$this->getRelationMap();

016

if(isset($id))$this->_ID =$id;

017

}

018

abstract protected function getTableName();

019

abstract protected function getRelationMap();

020

021

public function Load(){

022

if(isset($this->_ID)){

023

$sql ="SELECT ";

024

foreach($this->_arRelationMapas $k =>$v){

025

$sql .='`'.$k.'`,';

026

}

027

$sql .=substr($sql,0,strlen($sql)-1);

028

$sql .="FROM ".$this->_tableName." WHERE ".$this->pk." = ".$this->_ID;

029

$result =$this->_DB->mysql_query($sql);

030

foreach($result[0]as $k1 =>$v1){

031

$member =$this->_arRelationMap[$key];

032

if(property_exists($this,$member)){

033

if(is_numeric($member)){

034

eval('$this->'.$member.' = '.$value.';');

035

}else{

036

eval('$this->'.$member.' = "'.$value.'";');

037

}

038

}

039

}

040

}

041

$this->is_load = true;

042

}

043

public function __call($method,$param){

044

$type   =substr($method,0,3);

045

$member =substr($method,3);

046

switch($type){

047

case 'get':

048

return $this->getMember($member);

049

break;

050

case 'set':

051

return $this->setMember($member,$param[0]);

052

}

053

return false;

054

}

055

public function setMember($key){

056

if(property_exists($this,$key)){

057

if(is_numeric($val)){

058

eval('$this->'.$key.' = '.$val.';');

059

}else{

060

eval('$this->'.$key.' = "'.$val.'";');

061

}

062

$this->_modifyMap[$key] = 1;

063

}else{

064

return false;

065

}

066

}

067

068

public function getMember($key,$val){

069

if(!$this->is_load){

070

$this->Load();

071

}

072

if(property_exists($this,$key)){

073

eval('$res = $this->'.$key.';' );

074

return $this->$key;

075

}

076

return false;

077

}

078

079

public function save(){

080

if(isset($this->_ID)){

081

$sql ="UPDATE ".$this->_tableName." SET ";

082

foreach($this->arRelationMapas $k2 =>$v2){

083

if(array_key_exists($k2,$this->_modifyMap)){

084

eval('$val = $this->'.$v2.';');

085

$sql_update .=$v2." = ".$val;

086

}

087

}

088

$sql .=substr($sql_update,0,strlen($sql_update));

089

$sql .='WHERE '.$this->pk.' = '.$this->_ID;

090

}else{

091

$sql ="INSERT INTO ".$this->_tableName." (";

092

foreach($this->arRelationMapas $k3 =>$v3){

093

if(array_key_exists($k3,$this->_modifyMap)){

094

eval('$val = $this->'.$v3.';');

095

$field  .="`".$v3."`,";

096

$values .=$val;

097

}

098

}

099

$fields =substr($field,0,strlen($field)-1);

100

$vals   =substr($values,0,strlen($values)-1);

101

$sql .=$fields." ) VALUES (".$vals.")";

102

}

103

echo $sql;

104

//$this->_DB->query($sql);

105

}

106

public function __destory(){

107

if(isset($this->ID)){

108

$sql ="DELETE FROM ".$this->_tableName." WHERE ".$this->pk." = ".$this->_ID;

109

// $this->_DB_query($sql);

110

}

111

}

112

}

113

114

class Userextends Model{

115

protected  function getTableName(){

116

return "test_user";

117

}

118

protected function getRelationMap(){

119

return array(

120

'id'       => USER_ID,

121

'user_name'=> USER_NAME,

122

'user_age' => USER_AGE

123

);

124

}

125

public function getDB(){

126

return $this->_DB;

127

}

128

}

129

130

$UserIns =new User();

131

print_r($UserIns);

132

133

?>

php mysql orm_PHP ORM框架与简单代码实现(转)相关推荐

  1. Java orm框架的优缺点,ORM框架的简单介绍

    1. 什么是ORM? 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单来说,将程序中的兑现自动持久化 ...

  2. ORM框架---JOOQ简单介绍

    一,什么是JOOQ 继Hibernate Mybatis 之后的又一ORM框架 二,特点 1.get back in control of your sql 2.DSL(Domain Specific ...

  3. android 连接mysql orm_Android ORM框架 GreenDao 的使用详解

    一.前言 关于 Android 中常用的数据存储方式我们前面已经讲了 Sp 存储和文件存储,但是对于数据量比较大,并且结构复杂的数据我们想要存储只能通过数据库进行处理,Android 中提供了一个 S ...

  4. C#常用的几个ORM框架及简单对比

    ORM => 对象关系映射(英语:Object Relational Mapping)对于O/R,即 Object(对象)和 Relational(关系型数据),表示必须同时使用面向对象和关系型 ...

  5. js mysql orm_nodejs ORM框架对比

    name star sequelize 19.9k knex 10.5k Bookshelf 5.7k 以上数据截止2019.9.18 sequelize 文档齐全,Star最多. 支持数据库:pos ...

  6. yii mysql函数_Yii框架函数简单用法分析

    本文实例讲述了Yii框架函数简单用法.分享给大家供大家参考,具体如下: 1.redict return $this->redirect(['login']); redict其实是对于以下的封装  ...

  7. ORM框架的简单介绍

    1. 什么是ORM? 对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放 ...

  8. php mysql orm_PHP ORM操作MySQL数据库

    ORM----Oriented Relationship Mapper,即用面向对象的方式来操作数据库.归根结底,还是对于SQL语句的封装. 首先,我们的数据库有如下一张表: 我们希望能够对这张表,利 ...

  9. mysql的orm框架_Mysql-Sqlalchemy-ORM框架

    import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declar ...

最新文章

  1. ViewGroup的Touch事件分发(源码分析)
  2. 使用netty模仿dubbo服务
  3. 如何关闭Windows XP/Vista/Windows 7的DEP数据执行保护
  4. c 加密 java解密错误_google协议缓冲区-用C加密,用Java解密-InvalidProtocolBufferException...
  5. JS Array filter()方法
  6. swagger文档转换为WebApiClient声明式代码
  7. 849. 到最近的人的最大距离
  8. 《金狐系统维护盘》六周年纪念版UD/ISO +PE维护
  9. StringUtils详细介绍
  10. Oracle数据库中IN参数个数超过1000的问题
  11. PMP项目管理学习心得分享
  12. 计算机网络工程师试题及答案,计算机软考网络工程师自测试题及答案汇总
  13. 直播app源码的搭建,仍有许多问题等待我们去解决
  14. 基础学习——MySQL基础
  15. Android 准确过滤(禁止) Emoji表情
  16. 触摸屏学习:利用状态机编程
  17. 【PTA-python】第4章-15 换硬币 (20 分)
  18. Aho-Corasick(AC自动机)
  19. 深信服 | 2021 校招 [一面.二面.HR面]
  20. python七段数码管绘制实验报告_python—绘制七段数码管

热门文章

  1. [BZOJ1877][SDOI2009]SuperGCD
  2. 数字与中文信息的结合记忆(下)
  3. 置顶,博客中所有源码 github
  4. 动态修改attr里的多个属性
  5. SPFieldLookupValue
  6. win7(64,32)下JDK的安装和配置
  7. 从零开始学前端:CSS盒子模型属性 --- 今天你学习了吗?(CSS:Day14)
  8. 向mysql中添加更新时间_mysql 实现添加时间自动添加更新时间自动更新操作
  9. xstart连不上linux_Xstart远程连接Linux图形用户界面
  10. Python+tkinter实现验证码输入和切换