第三话:
数据库抽象层
ThinkPHP的数据库抽象层由来已久,这也是当初创立之初就作出的规划,以当初的想法,作为一个
应用框架,
模板引擎、数据库抽象层、MVC这些都是必不可少的,我的框架虽然小,但是也应当是五脏俱全。其实,那个时候国外有很多现成的数据库抽象层,但是因为都太庞大了,于是我就想写自己的抽象层,经过一些改造把以前自己写的
Mysql类当作原型,通过factory模式来扩展不同的数据库驱动,就形成了一个简易的数据库抽象层。之后,又不断增加各类数据库驱动,提供了常用数据库的支持。
在新版发布后,又增加了对PDO的支持(需要在PHP5环境下面),可以支持更加广泛的数据库接口,而且是
PHP官方在PHP5下面的推荐。和PDO的对接,ThinkPHP的数据库抽象层算是完成了自己的使命,在跨PHP4和PHP5的版本下面提供了充分的数据库支持。
ThinkPHP的抽象数据库访问层主要包含了数据库公共类、各类数据库驱动类和数据集对象。
在实际应用开发过程中,你可能并不需要接触这些类库,只需要通过各自的Dao对象来访问和操作数据库就可以,Dao对象处于抽象数据库访问层的上层,属于业务逻辑的实现层。数据库操作类库的主要特点有:
- 1、 支持事务和回滚(当然首先需要数据库本身支持),但是默认是自动提交
- 2、 在数据库调试模式下支持SQL语句的输出
- 3、 对数据库编码的支持
- 4、 把查询操作和执行操作分开,便于返回不同的结果
- 5、 支持配置文件和DSN两种数据库配置读取方式
- 6、 支持对数据集的数组和对象两种方式返回
- 7、 支持查询缓存
- 8、 支持查询和写入次数记录
数据库类库中最重要就是公共类Db的实现,除了引导各种数据库驱动之外,它还提供了数据库抽象访问的一些基本方法,包括CURD的SQL指令的抽象访问。查询的结果返回数据集对象ResultSet,而Dao对象把查询的数据集从数据集对象又转换成了Vo对象或者VoList对象。最终的目的是为了让应用操作数据库更加方便有效。
抽象数据库访问层的关键类库在于数据库的公共访问类Db类,这个类是操作数据库的底层接口,换句话说,Db类不能够独立存在,必须有对应的数据库驱动类库,但是开发人员不能够跨过该类直接进行数据库操作的访问。目前
系统支持的数据库包含有MySQL、MySQLi、MsSQL、PgSQL、SqLite和Oracle,可以通过驱动方式增加自己需要的数据库支持,开发人员也可以按照规范编写自己的数据库驱动(甚至包括众多的嵌入式数据库的驱动)。0.9.8版本开始已经增加了PDO的支持。
数据库的配置文件有多种
定义方式:
第一种 在数据库配置文件中定义
- //数据库设置
- define('DB_TYPE', 'mysql');define('DB_HOST', 'localhost');define('DB_NAME','web');define('DB_USER','root');define('DB_PWD','');define('DB_PORT','');
系统推荐使用该种方式,因为一般一个应用的数据库访问配置是相同的。
第二种 使用DSN方式在初始化Db类的时候传参数
- $db_dsn = “mysql://username:passwd@localhost:3306/DbName”;$db = new Db($db_dsn);
第三种 使用数组传参数
- $DSN = array(
-
'dbms' => 'mysql',-
'username' => 'username',-
'password' => 'password',-
'hostname' => 'localhost',-
'hostport' => '3306',-
'database' => 'dbname'-
);-
$db = new Db($DSN);
除了以上的一些特性外,正在实现的功能还包括对分布式数据库的支持。