发新话题
打印

ThinkPHP夜话之3:数据库抽象层

ThinkPHP夜话之3:数据库抽象层

第三话:数据库抽象层
  • 推荐指数:4
  • 难度系数:5
  • 实用指数:4


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);



除了以上的一些特性外,正在实现的功能还包括对分布式数据库的支持。

TOP

发新话题