400-696-8028

Creole :新兴数据抽象层

长沙北大青鸟作者:科泰校区Easy Chen

摘要:说起数据抽象层,大家可能首先想起的就是ADODB。这里要为大家介绍的是一个全新的数据抽象层:Creole。说它新,是因为它是用PHP5写的,是一个基于真正意义的OO的层;它的API接口以JDBC为基础,熟悉JDBC的朋友用起来应
说起数据抽象层,大家可能首先想起的就是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 


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

Click to fullsize


这样我们就已经成功安装好了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 filesEasyPHP5homedevtest.php on line 2Fatal error: main() [function.require]: Failed opening required '/creole/Creole.php' (include_path='.;C:php5pear') in c:program filesEasyPHP5homedevtest.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:phpincludes"

将最后一行改成:

include_path = ".;C:Program FilesEasyPHP5phpPEAR"

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



试用
现在开始我们就可以在程序中使用Creole了。下边我们将连接数据库,并从中取出user表的全部用户。下边是完整的代码:
<?phprequire_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正是由这样的一组class组成的。

Click to fullsize



参考
我们对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');

作者简介
Easy Chen , 04年毕业于石油大学(北京) 计算机系,ReleaseEasy/ Rticle 作者。喜好网络技术写作,《PHP&MORE》编辑,联系信箱:EasyChen at Gmail.com
关于我们
公司简介
发展历程
青鸟荣誉
联系我们
加入我们
青鸟课程
BCVE视频特效课程
BCUI全链路UI设计
BCSP软件开发专业
BCNT网络工程师
启能职业教育基础课程
长沙初中生学什么
长沙高中生学什么
长沙大学生学什么