Nov 25

Creole :新兴数据抽象层 不指定

bkkkd , 14:56 , 开发应用 , 评论(0) , 引用(0) , 阅读(5054) , Via 本站原创 | |
说起数据抽象层,大家可能首先想起的就是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 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正是由这样的一组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');

发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]