Creole :新兴数据抽象层

来源:互联网 发布:分布式视频矩阵 编辑:程序博客网 时间:2024/04/29 17:27

说起数据抽象层,大家可能首先想起的就是ADODB。这里要为大家介绍的是一个全新的数据抽象层:Creole。说它新,是因为它是用PHP5 写的,是一个基于真正意义的OO的层;它的API 接口以JDBC 为基础,熟悉JDBC的朋友用起来应该会很亲切;它现在支持的数据库有MySQL, MS SQLServer, 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/jargon-current.tgz

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

11.jpg

这样我们就已经成功安装好了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 表的全部用户。下边是完整的代码:

0 1 require_once 'creole/Creole.php';
2 $dsn = "mysql://root@localhost/r4";
3 $conn = Creole::getConnection($dsn);
4 $rs = $conn->executeQuery("SELECT * FROM user");
5 while($rs->next())
6 {
7 echo $rs->getString("login_name") . " (" . $rs->getInt("id") . ")";
8 }
9 ?>

这里讲解下上边代码的含义。第一行载入了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 组成的。

12.jpg

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

作者简介

1.jpg

Easy Chen , 04 年毕业于石油大学(北京) 计算机系,ReleaseEasy/Rticle 作者。喜好网络技术写作,《PHP&MORE》编辑,联系信箱:EasyChen@Gmail.com

原创粉丝点击