[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()
~~~
- 更新记录
- 概述
- 文件索引
- 函数索引
- 章节格式
- 框架流程
- 前:章节说明
- 主:(index.php)入口
- 主:(start.php)框架引导
- 主:(App.php)应用启动
- 主:(App.php)应用调度
- C:(Controller.php)应用控制器
- M:(Model.php)数据模型
- V:(View.php)视图对象
- 附:(App.php)应用启动
- 附:(base.php)全局变量
- 附:(common.php)模式配置
- 附:(convention.php)全局配置
- 附:(Loader.php)自动加载器
- 附:(Build.php)自动生成
- 附:(Hook.php)监听回调
- 附:(Route.php)全局路由
- 附:(Response.php)数据输出
- 附:(Log.php)日志记录
- 附:(Exception.php)异常处理
- 框架工具
- 另:(helper.php)辅助函数
- 另:(Cache.php)数据缓存
- 另:(Cookie.php)cookie操作
- 另:(Console.php)控制台
- 另:(Debug.php)开发调试
- 另:(Error.php)错误处理
- 另:(Url.php)Url操作文件
- 另:(Loader.php)加载器实例化
- 另:(Input.php)数据输入
- 另:(Lang.php)语言包管理
- 另:(ORM.php)ORM基类
- 另:(Process.php)进程管理
- 另:(Session.php)session操作
- 另:(Template.php)模板解析
- 框架驱动
- D:(\config)配置解析
- D:(\controller)控制器扩展
- D:(\model)模型扩展
- D:(\db)数据库驱动
- D:(\view)模板解析
- D:(\template)模板标签库
- D:(\session)session驱动
- D:(\cache)缓存驱动
- D:(\console)控制台
- D:(\process)进程扩展
- T:(\traits)Trait目录
- D:(\exception)异常实现
- D:(\log)日志驱动
- 使用范例
- 服务器与框架的安装
- 控制器操作
- 数据模型操作
- 视图渲染控制
- MVC开发初探
- 模块开发
- 入口文件定义全局变量
- 运行模式开发
- 框架配置
- 自动生成应用
- 事件与插件注册
- 路由规则注册
- 输出控制
- 多种应用组织
- 综合应用
- tp框架整合后台auto架构快速开发
- 基础原理
- php默认全局变量
- php的魔术方法
- php命名空间
- php的自动加载
- php的composer
- php的反射
- php的trait机制
- php设计模式
- php的系统时区
- php的异常错误
- php的输出控制
- php的正则表达式
- php的闭包函数
- php的会话控制
- php的接口
- php的PDO
- php的字符串操作
- php的curl
- 框架心得
- 心:整体结构
- 心:配置详解
- 心:加载器详解
- 心:输入输出详解
- 心:url路由详解
- 心:模板详解
- 心:模型详解
- 心:日志详解
- 心:缓存详解
- 心:控制台详解
- 框架更新
- 4.20(验证类,助手函数)
- 4.27(新模型Model功能)
- 5.4(新数据库驱动)
- 7.28(自动加载)