热烈祝贺台州朗动科技的站长论坛隆重上线!(2012-05-28)    热烈庆祝伟大的祖国60周年生日 点击进来我们一起为她祝福吧(2009-09-26)    站长论坛禁止发布广告,一经发现立即删除。谢谢各位合作!.(2009-08-08)    热烈祝贺台州网址导航全面升级,全新版本上线!希望各位一如既往地支持台州网址导航的发展.(2009-03-28)    台州站长论坛恭祝各位新年快乐,牛年行大运!(2009-01-24)    台州Link正式更名为台州网址导航,专业做以台州网址为主的网址导航!(2008-05-23)    热烈祝贺台州Link资讯改名为中国站长资讯!希望在以后日子里得到大家的大力支持和帮助!(2008-04-10)    热烈祝贺台州Link论坛改名为台州站长论坛!希望大家继续支持和鼓励!(2008-04-10)    台州站长论坛原[社会琐碎]版块更名为[生活百科]版块!(2007-09-05)    特此通知:新台州站长论坛的数据信息全部升级成功!">特此通知:新台州站长论坛的数据信息全部升级成功!(2007-09-01)    台州站长论坛对未通过验证的会员进行合理的清除,请您谅解(2007-08-30)    台州网址导航|上网导航诚邀世界各地的网站友情链接和友谊联盟,共同引领网站导航、前进!(2007-08-30)    禁止发广告之类的帖,已发现立即删除!(2007-08-30)    希望各位上传与下载有用资源和最新信息(2007-08-30)    热烈祝贺台州站长论坛全面升级成功,全新上线!(2007-08-30)    
便民网址导航,轻松网上冲浪。
台州维博网络专业开发网站门户平台系统
您当前的位置: 首页 » MySQL/MSSQL编程 » Creole :新兴数据抽象层

Creole :新兴数据抽象层

论坛链接
  • Creole :新兴数据抽象层
  • 发布时间:2007-09-29 21:58:42    浏览数:7290    发布者:tznktg    设置字体【   
说起数据抽象层,大家可能首先想起的就是ADODB。这里要为大家介绍的是一个全新的数据抽象层:Creole。说它新,是因为它是用PHP5写的,是一个基于真正意义的OO的层;它的API接口以JDBC为基础,熟悉JDBC的朋友用起来应该会很亲切;它现在支持的数据库有MySQL, MS SQL Server, PostgreSQL, SQLite。Oracle的driver正在开发中,当然,你也可以为自己要使用的数据库写Driver。


安装
下面我们就来看看在Windows+Apache+PHP5上Creole的安装和初步使用。首先你要安装好PEAR,如果你还没有安装好,可以双击php目录下的go-pear.bat文件,然后这个程序会引导你进行安装。关于PEAR的安装不是本文的内容,请自行查阅相关资料。当你安装好PEAR后,我们就要利用它的install功能了。
首先进入命令行方式,Cd到你安装php的目录下。然后在命令行中键入下边命令,这样PEAR会自动帮我们下载并安装好Creole包。

pear install http://creole.phpdb.org/pear/creole-current.tgz


如果你键入的命令正确的话,应该看到下边的安装提示。


这样我们就已经成功安装好了Creole,不过为了能使用它我们还得再安装一个jargon包,这个包封装了数据表和字段层次的一些信息。安装的方法和上边一样,键入如下命令就可以了:

pear install http://creole.phpdb.org/pear/jargon-current.tgz


配置
下面我们就可以使用Creole了。在web可以访问的目录下建立一个PHP文件,我们先来尝试包含Creole类,这是每一个要使用Creole的程序都要做的事。我们加入下边的代码:

require_once 'creole/Creole.php';


然后在浏览器中访问这个页面,结果出现了下边的错误:

Warning: main(/creole/Creole.php) [function.main]: failed to open stream: No such file or directory in c:\program files\EasyPHP5\home\dev\test.php on line 2

Fatal error: main() [function.require]: Failed opening required '/creole/Creole.php' (include_path='.;C:\php5\pear') in c:\program files\EasyPHP5\home\dev\test.php on line 2


这是因为我们没有设置好php.ini来包含PEAR库的路径,所以php.exe找不到文件,只好报错了。现在我们把PEAR库的地址添加到php.ini中。在php.ini中找到这段:


;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;

; UNIX: "/path1:/path2"
;include_path = ".:/php/includes"
;
; Windows: "path1;path2"
;include_path = ".;c:\php\includes"


将最后一行改成:


include_path = ".;C:\Program Files\EasyPHP5\php\PEAR"

其中C:\Program Files\EasyPHP5\php\PEAR是PEAR在你机器上的绝对路径。注意要去掉行首的分号。然后重启Apache。再访问看看,好了。:)



试用
现在开始我们就可以在程序中使用Creole了。下边我们将连接数据库,并从中取出user表的全部用户。下边是完整的代码:

<?php
require_once 'creole/Creole.php';
$dsn = "mysql://root@localhost/r4";
$conn = Creole::getConnection($dsn);
$rs = $conn->executeQuery("SELECT * FROM user");
while($rs->next())
{
echo $rs->getString("login_name") . " (" . $rs->getInt("id") . ")";
}
?>


这里讲解下上边代码的含义。第一行载入了Creole类,第二行定义了一个用于连接数据库的字符串,格式是“数据库类型名://用户名:密码@HOST/数据库名”。第三行创建了一个连接对象,第四行利用这个对象执行了一句SQL,并返回一个结果集。第五到八行遍历了这个结果集并输出数据。


析构
怎么样,看起来不错吧,如果你感兴趣可以按照Creole站上的Guide一步一步做下去。不过我们就要做别的事情了:P 前边说过了,Creole更多的注重于OO,同时又带有很强的Java风格,因此对于我们学习使用PHP5来设计OO方式的程序是很好的范例。下边我们就来看看它的架构。首先要了解的是它的目录结构,在Windows命令行方式键入tree,就可以打印出一个目录的结构(一个有用的小技巧哦),下边是由此得到的Creole目录结构,目录后边加上了简要的说明。
我们以Statement为例,看看Creole是怎么组织的。首先在根目录下的Statement.php中定义了Statement接口,这个接口规定了Statement必须实现的一些方法。然后,在/common目录下的StatementCommon.php中定义了名为StatementCommon的抽象类,在这个类中,包含了Statement.php中定义的接口的实现代码,但是并没有定义为实现Statement接口。


Root // Creole的根目录
├─common // 存放了Creole的抽象类
├─drivers
│ ├─mssql
│ │ └─metadata // mssql实现
│ ├─mysql
│ │ └─metadata // mysql实现
│ ├─pgsql
│ │ └─metadata
│ └─sqlite
│ └─metadata
├─metadata // 数据表原始信息类
└─util
└─sql


而在/drivers/mysql/目录下的MysqlStatement则继承了StatementCommon和实现Statement方法。这样MysqlStatement可以共享到StatementCommon中的方法,需要定制时可以重载StatementCommon的方法;同时,MysqlStatement又受到Statement接口的约束。

下一页的图表示了Statement,StatementCommon和MysqlStatement之间的关系。正是这样的结构,使定义和实现得到了有效的分离。Creole中大量采用了这样的结构,在我们编写自己的Driver时非常方便。如果要添加一个TextStatement,可以自己实现一个class,只要这个class实现了Statement接口就可以了。而Driver


参考
我们对Creole的介绍到这里就告一个段落了,而对你来说,一切才刚刚开始。下边是从两个常用类的接口程序内中整理出来的方法,希望能对你有所帮助。

Statement

public function setLimit($v);
public function getLimit();
public function setOffset($v);
public function getOffset();
public function close();
public function execute($sql, $fetchmode = null);
public function getResultSet();
public function executeQuery($sql, $fetchmode = null);
public function executeUpdate($sql);
public function getMoreResults();
public function getConnection();


ResultSet

public function getResource();
public function setFetchmode($mode);
public function getFetchmode();
public function isIgnoreAssocCase();
public function next();
public function previous();
public function relative($offset);
public function absolute($pos);
public function seek($rownum);
public function first();
public function last();
public function beforeFirst();
public function afterLast();
public function isAfterLast();
public function isBeforeFirst();
public function getCursorPos();
public function getRow();
public function getRecordCount();
public function close();
public function get($column);
public function getArray($column);
public function getBoolean($column);
public function getBlob($column);
public function getClob($column);
public function getDate($column, $format = '%x');
public function getFloat($column);
public function getInt($column);
public function getString($column);
public function getTime($column, $format = '%X');
public function getTimestamp($column, $format = 'Y-m-d H:i:s'); [ 本帖最后由 tznktg 于 2007-9-29 22:00 编辑 ]
娱乐休闲专区A 影视预告B 音乐咖啡C 英语阶梯D 生活百科
网页编程专区E AMPZF HTMLG CSSH JSI ASPJ PHPK JSPL MySQLM AJAX
Linux技术区 N 系统管理O 服务器架设P 网络/硬件Q 编程序开发R 内核/嵌入
管理中心专区S 发布网址T 版主议事U 事务处理