php5.5.12驱动,5.4(新数据库驱动)

[TOC]

****

## 1 简介

### 1-1 数据库驱动层次

TP5的数据库驱动实现了重构

从应用到底层从上到下分为以下几部分

>[info]1 数据库中间层(Db.php):数据库操作接口

>[info]2 数据库连接(Connection.php):数据库连接操作与查询入口

>[info]3 数据库查询(Query.php):数据库查询操作

>[info]4 数据库查询语句构造(Builder.php):合成数据库查询语句

另外还是要Model封装了数据库的ORM操作

有关模型ORM的分析见 新模型Model功能

### 1-2 层次关系

>[info]1 Db.php:数据库操作接口

>[info]2 Connection.php:数据库连接接口

>[info]3 Query.php:数据库语句执行接口

>[info]4 Builder.php:数据库语句生成接口

整个层次实现为通过(Builder.php)生成语句,然后在(Connection.php)连接的数据库实例上,通过(Query.php)执行生成的语句

而Db.php作为数据库的操作接口

## 2 数据库中间层(Db.php)

### 2-1 成员变量

~~~

;所有数据库连接实例,当前数据库连接实例

private static $instances = [];

private static $instance = null;

;数据库查询次数统计,数据库执行次数统计

public static $queryTimes = 0;

public static $executeTimes = 0;

~~~

### 2-2 public 成员方法

#### 1 connect() 数据库初始化

~~~

public static function connect($config = [])

~~~

> $config:数据库连接配置

> 生成数据库连接实例存储到$instances与$instance中,并返回self::$instance

~~~

;使用Db::connect()初始化数据库连接

$db = Db::connect([

'type' => 'mysql',

'dsn' => '',

'hostname' => '127.0.0.1',

'database' => 'thinkphp',

'username' => 'root',

'password' => '',

'hostport' => '',

'params' => [],

'charset' => 'utf8',

'prefix' => 'think_',

]);

~~~

~~~

;使用/config/database.php配置中的连接参数

return [

'type' => 'mysql',

'dsn' => '',

'hostname' => '127.0.0.1',

'database' => 'thinkphp',

'username' => 'root',

'password' => '',

'hostport' => '',

'params' => [],

'charset' => 'utf8',

'prefix' => 'think_',

'debug' => false,

'deploy' => 0,

'rw_separate' => false,

'master_num' => 1,

'slave_no' => '',

];

$db = Db::connect();

~~~

~~~

;使用字符串配置

$db = Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8');

~~~

~~~

;/config/database.php中多个数据库配置

//数据库配置1

'db_config1' => [

'type' => 'mysql',

'hostname' => '127.0.0.1',

'database' => 'thinkphp',

'username' => 'root',

'password' => '',

'charset' => 'utf8',

'prefix' => 'think_',

],

//数据库配置2

'db_config2' => 'mysql://root:1234@localhost:3306/thinkphp#utf8';

$db1 = Db::connect('db_config1');

$db2 = Db::connect('db_config2');

~~~

~~~

;在Model中配置数据库连接

namespace app\index\model;

use think\Model;

class User extends Model

{

protected static $connection = [

'type' => 'mysql',

'dsn' => '',

'hostname' => '127.0.0.1',

'database' => 'thinkphp',

'username' => 'root',

'password' => '',

'hostport' => '',

'params' => [],

'charset' => 'utf8',

'prefix' => 'think_',

'debug' => false,

'deploy' => 0,

'rw_separate' => false,

'master_num' => 1,

'slave_no' => '',

];

}

~~~

~~~

;模型中字符串数据库连接配置

namespace app\index\model;

use think\Model;

class User extends Model

{

//或者使用字符串定义

protected static $connection = 'mysql://root:1234@127.0.0.1:3306/thinkphp#utf8';

}

~~~

#### 2 __callStatic() 数据库静态方法调用拦截

~~~

public static function __callStatic($method, $params)

~~~

>$method:调用的方法名

>$paramse:调用方法的参数

>内部调用self::$instance对应的方法。

~~~

;数据库查询语句

$data = Db::query('select * from think_user where id=?',[8]);

;数据库语句执行

$result = Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);

;使用助手函数

$data = db($config)->query('select * from think_user where id=:id',['id'=>8]);

~~~

### 2-3 private 方法

#### 1 parseConfig() 数据库配置解析

~~~

private static function parseConfig($config)

~~~

> $config:数据库连接参数,如果为空则获取配置文件database.php中数据库连接配置参数

#### 2 parseDsn() 数据库DSN配置解析

~~~

private static function parseDsn($dsnStr)

~~~

> $dsnStr :dsn字符串

> 解析字符串为数据库配置参数

## 3 数据库连接(Connection.php)

### 3-1 成员变量

~~~

;PDO操作实例

protected $PDOStatement;

;当前操作的数据表名;当前操作的数据对象名;当前SQL指令

protected $table = '';

protected $name = '';

protected $queryStr = '';

;操作结果最后插入ID;返回或者影响记录数

protected $lastInsID;

protected $numRows = 0;

;事务的数据库连接;事务指令数;事务标识

protected $transPDO;

protected $transTimes = 0;

protected $transLabel = '';

;错误信息;数据库连接ID数组 ;当前连接ID

protected $error = '';

protected $links = [];

protected $linkID;

;查询结果类型 ;字段属性大小写;监听回调

protected $fetchType = PDO::FETCH_ASSOC;

protected $attrCase = PDO::CASE_LOWER;

protected static $event = [];

;数据库连接参数配置

protected $config = [

'type' => '',

'hostname' => '',

'database' => '',

'username' => '',

'password' => '',

'hostport' => '',

'dsn' => '',

'params' => [],

'charset' => 'utf8',

'prefix' => '',

'debug' => false,

'deploy' => 0,

'rw_separate' => false,

'master_num' => 1,

'slave_no' => '',

'fields_strict' => true,

];

;PDO连接参数

protected $params = [

PDO::ATTR_CASE => PDO::CASE_LOWER,

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,

PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,

PDO::ATTR_STRINGIFY_FETCHES => false,

PDO::ATTR_EMULATE_PREPARES => false,

];

~~~

### 3-2 public成员方法

#### 1 __construct() 连接构造函数

~~~

public function __construct(array $config = [])

~~~

> $config:连接配置信息

> 获取配置参数创建查询对象。

#### 2 __call() 连接对象方法回调拦截

~~~

public function __call($method, $args)

~~~

> $method: 调用的方法名

> $args: 调用方法的参数

> 内部调用查询对象的对应方法

#### 3 getConfig() 获取数据库配置

~~~

public function getConfig($config)

~~~

> $config: 配置名称

> 返回数据库配置中对应名称的值

#### 4 setConfig() 修改数据库配置

~~~

public function setConfig($config, $value)

~~~

> $config:配置名称,$value:配置名称值

#### 5 connect() 数据库连接

~~~

public function connect(array $config = [], $linkNum = 0, $autoConnection = false)

~~~

> $config: 数据库连接配置

> $linkNum 连接序号

> $autoConnection 自动连接控制(分布式中)

#### 6 getDriverName() 获取数据库驱动类型

~~~

public function getDriverName()

~~~

> 返回数据库驱动类型或者数据库类型

#### 7 free() 释放查询结果

~~~

public function free()

~~~

> 置空PDOStatement

#### 8 getPdo() 获取PDO对象

~~~

public function getPdo()

~~~

#### 9 query() 执行数据库查询(重点)

~~~

public function query($sql, $bind = [], $fetch = false, $master = false, $returnPdo = false)

~~~

> $sql: 数据库语句

> $bind: 参数绑定

> $fetch: 是否只返回合并的sql语句

> $master: 是否在主服务器操作

> $returnPdo: 是否返回PDOStatement对象

#### 10 execute() 执行数据库操作语句(重点)

~~~

public function execute($sql, $bind = [], $fetch = false, $getLastInsID = false)

~~~

> $sql: 数据库语句

> $bind: 参数绑定

> $fetch: 是否只返回合并的sql语句

> $getLastInsID:是否返回自增ID

#### 11 transaction() 执行数据库事务

~~~

public function transaction($callback)

~~~

> $callback 数据库事务回调

#### 12 startTrans()  数据库事务启动

~~~

public function startTrans($label = '')

~~~

> $label:事务标识

#### 13 commit() 数据库事务手动提交

~~~

public function commit($label = '')

~~~

> $label:事务标识

#### 14 rollback() 数据库事务回滚

~~~

public function rollback()

~~~

#### 15 batchQuery() 数据库语句数组执行

~~~

public function batchQuery($sql = [])

~~~

> $sql:数据库语句数组

#### 16 parseSqlTable() 数据库表前缀替换

~~~

public function parseSqlTable($sql)

~~~

> $sql:数据库语句

#### 17 getQueryTimes() 获取查询次数

~~~

public function getQueryTimes($execute = false)

~~~

> $execute:是否返回执行次数

#### 18 getExecuteTimes() 获取执行次数

~~~

public function getExecuteTimes()

~~~

#### 19 close() 关闭数据库

~~~

public function close()

~~~

#### 20 getLastSql() 获取最后一次查询的sql语句

~~~

public function getLastSql()

~~~

#### 21 getLastInsID() 获取最后插入的ID

~~~

public function getLastInsID()

~~~

#### 22 getError() 获取最后的错误信息

~~~

public function getError()

~~~

#### 23 quote() sql指令安全过滤

~~~

public function quote($str)

~~~

> $str:待过滤sql语句

#### 24 listen() 注册sql监听回调

~~~

public function listen($callback)

~~~

> $callback: 监听回调数组键名为事件名,键值为回调

#### 25 __destruct() 数据库析构方法

~~~

public function __destruct()

~~~

> 释放数据库资源

### 3-3 abstract成员方法

#### 1 parseDsn() 解析DSN配置

~~~

abstract protected function parseDsn($config);

~~~

> 在具体类型的数据库连接中实现

### 3-4 protected成员方法

#### 1 fieldCase() 数据库表字段大小写转换

~~~

protected function fieldCase($info)

~~~

> $info 字段信息

> 根据PDO参数转换对应字段大小写

#### 2 getBindSql() 组织SQL语句

~~~

protected function getBindSql($sql, array $bind = [])

~~~

> $sql: sql语句

> $bind: 绑定参数列表

> 返回组织的SQL语句

#### 3 bindValue() 参数绑定处理

~~~

protected function bindValue(array $bind = [])

~~~

> $bind:绑定参数列表

#### 4 getResult() 获取数据集

~~~

protected function getResult()

~~~

> 调用PDO的fetchAll()获取操作结果

#### 5 debug() 数据库调试操作

~~~

protected function debug($start)

~~~

> $start:true,数据库调试开始;false,数据库调试结束

#### 6 trigger() 触发SQL事件

~~~

protected function trigger($sql, $runtime, $explain = [])

~~~

> $sql语句

> $runtime sql运行时间

> $explain sql分析

#### 7 initConnect() 数据库连接初始化

~~~

protected function initConnect($master = true)

~~~

> $master:是否主服务器连接

#### 8 multiConnect() 主数据库连接

~~~

protected function multiConnect($master = false)

~~~

> $master:是否主服务器连接

### 3-5 数据库连接驱动(db\connector\)

数据库连接实现为下不同类型数据库的连接

目前包含Mysql,Oracle,Pgsql,Sqlite,Sqlsrv等数据库

各种数据库连接主要包含的方法如下

~~~

;解析DSN字符串

protected function parseDsn($config)

;获取数据库表字段信息

public function getFields($tableName)

;获取数据库表单信息

public function getTables($dbName = '')

;sql性能分析

protected function getExplain($sql)

~~~

## 4 数据库查询(Query.php)

### 4-1 成员变量

~~~

;连接对象,驱动类型

protected $connection;

protected $driver;

;查询参数,绑定参数

protected $options = [];

protected $bind = [];

~~~

### 4-2 public成员方法

#### 1 __construct() 构造查询对象

~~~

public function __construct($connection = '')

~~~

> $connection:连接对象

> 初始化连接对象$this->connection和连接类型$this->driver

#### 2 __call() 对象方法调用拦截

~~~

public function __call($method, $args)

~~~

> $method:调用的方法名

> $args:调用方法的参数

> 内部调用where()->find(),或者where()->value()

#### 3 value() 获取某个字段的值

~~~

public function value($field)

~~~

> $field:字段名

>

#### 4 column() 获取某个列的数组

~~~

public function column($field, $key = '')

~~~

> $filed:字段名或字段数组名

> $key:索引

#### 5 count() COUNT查询

~~~

public function count($field = '*')

~~~

> $filed:统计的列字段名称

#### 6 sum() SUM查询

~~~

public function sum($field = '*')

~~~

> $field:求和的列字段名称

#### 7 min() MIN查询

~~~

public function min($field = '*')

~~~

> $filed:求最小值的列字段名称

#### 8 max() MAX查询

~~~

public function max($field = '*')

~~~

> $field:求最大值的列字段名称

#### 9 avg() AVG查询

~~~

public function avg($field = '*')

~~~

> $field:求平均值的列字段名称

#### 10 setField() 修改字段的值

~~~

public function setField($field, $value = '')

~~~

> $field:修改的字段列名称

> $value:字段值

#### 11 setInc() 字段自增

~~~

public function setInc($field, $step = 1, $lazyTime = 0)

~~~

> $field:自增的字段列名称

> $step:自增的值

> $lazyTime:延迟的值

#### 12 setDec() 字段自减

~~~

public function setDec($field, $step = 1, $lazyTime = 0)

~~~

> $field:自减的字段列名称

> $step:自减的值

> $lazyTime:延迟时间

#### 13 joins() join查询

~~~

public function join($join, $condition = null, $type = 'INNER')

~~~

> $join:关联的表信息

> $condition:查询条件

> $type:joins类型

#### 14 union() union查询

~~~

public function union($union, $all = false)

~~~

> $union:union语句

> $all:

#### 15 field() 指定查询字段

~~~

public function field($field, $except = false, $tableName = '', $prefix = '', $alias = '')

~~~

> $filed:字段名

> $except: 字段排除控制

> $tableName: 数据表名

> $prefix: 字段前缀

> $alias: 别名前缀

#### 16 where() 指定查询条件

~~~

public function where($field, $op = null, $condition = null)

~~~

> $field:字段名

> $op:查询表达式

> $condition:查询条件

#### 17 whereOr() Or查询条件

~~~

public function whereOr($field, $op = null, $condition = null)

~~~

> $field:字段名

> $op:查询表达式

> $condition:查询条件

#### 18 whereExist() whereOrExist() whereNotExist() whereOrNotExist() 查询条件

~~~

public function whereExist($where)

public function whereOrExist($where)

public function whereNotExist($where)

public function whereOrNotExist($where)

~~~

> $where:条件表达式

#### 19 limit() limit生成

~~~

public function limit($offset, $length = null)

~~~

> $offset:起始位置

> $length:获取长度

#### 20 page() 分页查询

~~~

public function page($page, $listRows = null)

~~~

> $page:页数

> $listRows:每页数量

#### 21 table() From语句

~~~

public function table($table)

~~~

> $table:操作表名称

#### 22 using() USING语句

~~~

public function using($using)

~~~

#### 23 order() ORDER语句

~~~

public function order($field, $order = null)

~~~

> $field:排序字段

> $order:排序控制

#### 24 cache() 查询缓存

~~~

public function cache($key = true, $expire = null)

~~~

> $key:缓存控制

> $expire:缓存时间

#### 25 group() GROUP语句

~~~

public function group($group)

~~~

#### 26 having() HAVING语句

~~~

public function having($having)

~~~

#### 27 lock() LOCK语句

~~~

public function lock($lock = false)

~~~

#### 28 distinct() DISTINCT语句

~~~

public function distinct($distinct)

~~~

#### 29 alias() 数据表别名

~~~

public function alias($alias)

~~~

#### 30 force() 强制索引

~~~

public function force($force)

~~~

#### 31 comment() 注释语句

~~~

public function comment($comment)

~~~

#### 32 fetchSql() 是否返回SQL语句

~~~

public function fetchSql($fetch = true)

~~~

#### 33 fetchPdo() 是否返回Pdo

~~~

public function fetchPdo($pdo = true)

~~~

#### 34 master() 是否主服务器

~~~

public function master()

~~~

#### 35 strict() 是否严格检查字段名

~~~

public function strict($strict = true)

~~~

#### 36 failException() 是否抛出异常

~~~

public function failException($fail = true)

~~~

#### 37 model() 指定当前模型

~~~

public function model($model)

~~~

#### 38 name() 指定当前模型名

~~~

public function name($name)

~~~

#### 39 getTable() 获取当前的数据表

~~~

public function getTable()

~~~

#### 40 getTableInfo() 获取数据表信息

~~~

public function getTableInfo($tableName = '', $fetch = '')

~~~

#### 41 getPk() 获取主键

~~~

public function getPk($table = '')

~~~

#### 42 bind() 参数绑定处理

~~~

public function bind($key, $value = false, $type = PDO::PARAM_STR)

~~~

#### 43 isBind() 检查是否绑定参数

~~~

public function isBind($key)

~~~

#### 44 getOptions() 获取查询参数

~~~

public function getOptions($name = '')

~~~

#### 45 with() 关联查询JOIN预查询

~~~

public function with($with)

~~~

#### 46 via() 设置字段的表别名

~~~

public function via($via = '')

~~~

#### 47 relation() 设置关联查询

~~~

public function relation($relation)

~~~

#### 48 insert() 添加数据

~~~

public function insert(array $data, $replace = false, $getLastInsID = false)

~~~

#### 49 insertGetId() 添加数据获取自增ID

~~~

public function insertGetId(array $data, $replace = false)

~~~

#### 50 insertAll() 批量添加数据

~~~

public function insertAll(array $dataSet)

~~~

#### 51 selectInsert() 添加查询结果到数据库

~~~

public function selectInsert($fields, $table)

~~~

#### 52 update() 更新数据

~~~

public function update(array $data)

~~~

#### 53 select() 查询多条数据

~~~

public function select($data = [])

~~~

#### 54 find() 查询单条数据

~~~

public function find($data = [])

~~~

#### 55 chunk() 分批数据返回处理

~~~

public function chunk($count, $callback, $column = null)

~~~

#### 56 getBind() 获取绑定参数并清空

~~~

public function getBind()

~~~

#### 57 buildSql() 构造子查询

~~~

public function buildSql($sub = true)

~~~

#### 58 delete() 删除数据

~~~

public function delete($data = [])

~~~

#### 59 parseExpress() 检查查询参数

~~~

public function parseExpress()

~~~

### 4-3 protected成员方法

#### 1 builder() 创建查询语句构建对象

~~~

protected function builder()

~~~

> 根据$this->driver数据库类型创建对应构建对象

> 设置当前查询对象 setQuery()

#### 2 lazyWrite() 延迟更新时间

~~~

protected function lazyWrite($guid, $step, $lazyTime)

~~~

> $guid:写入标识

> $step:写入步进值

> $lazyTime:写入的延迟时间

#### 3 parseWhereExp() 合成查询下条件

~~~

protected function parseWhereExp($operator, $field, $op, $condition, $param = [])

~~~

> $operator:条件缓存键名

> $field: 查询字段

> $op:查询表达式

> $condition:查询条件

> $param:查询参数

#### 4 parsePkWhere() 解析主键为查询条件

~~~

protected function parsePkWhere($data, &$options)

~~~

## 5 查询语句构造(Builder.php)

### 5-1 成员变量

~~~

;数据库连接实例,查询实例

protected $connection;

protected $query;

;查询参数

protected $options = [];

;运算符转换数组

protected $exp = [];

;语句构造模板

protected $selectSql;

protected $insertSql;

protected $insertAllSql;

protected $updateSql;

protected $deleteSql;

~~~

### 5-2 public 成员方法

#### 1 __construct() 构造函数

~~~

public function __construct($connection)

~~~

> 初始化数据库连接对象

#### 2 setQuery() 设置Query对象

~~~

public function setQuery($query)

~~~

#### 3 buildWhere() 生成where语句

~~~

public function buildWhere($where, $table)

~~~

#### 4 select() 生成select语句

~~~

public function select($options = [])

~~~

#### 5 insert() 生成insert语句

~~~

public function insert(array $data, $options = [], $replace = false)

~~~

#### 6 insertAll() 生成InsertAll语句

~~~

public function insertAll($dataSet, $options)

~~~

#### 7 selectInsert() 生成selectinsert语句

~~~

public function selectInsert($fields, $table, $options)

~~~

#### 8 update() 生成update语句

~~~

public function update($data, $options)

~~~

#### 9 delete() 生成delete语句

~~~

public function delete($options)

~~~

### 5-3 protected 成员方法

~~~~

;Table,Data,Key,Value,Field,Table,Where等解析

protected function parseSqlTable($sql)

protected function parseData($data, $options)

protected function parseKey($key)

protected function parseValue($value)

protected function parseField($fields)

protected function parseTable($tables)

protected function parseWhere($where, $table)

;where子单元解析,闭包子查询解析,Limit解析,Join解析,Order解析,Group解析,Having解析,Comment解析,Distinct解析,Union解析,index解析,Lock解析

protected function parseWhereItem($key, $val, $rule = '')

protected function parseClosure($call, $show = true)

protected function parseLimit($limit)

protected function parseJoin($join)

protected function parseOrder($order)

protected function parseGroup($group)

protected function parseHaving($having)

protected function parseComment($comment)

protected function parseDistinct($distinct)

protected function parseUnion($union)

protected function parseForce($index)

protected function parseLock($lock = false)

~~~~

### 5-4 数据库语句构造驱动(\db\builder\)

在构造驱动目录下实现了针对不同数据库的语句生成驱动

目前包含Mysql,Oracle,Pgsql,Sqlite,Sqlsrv6种

其中的主要方法为Builder.php的方法覆盖或者扩展

~~~

;字段和表名处理

protected function parseKey($key)

;随机排序

protected function parseRand()

~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值