-
數據庫抽象層
鎖定
- 中文名
- 數據庫抽象層
- 語 種
- PHP
- 原 因
- 使用數據庫抽象層的原因
- 代 表
- MS SQL Server遷移到MySQL
- 類 型
- 電子信息工程術語
數據庫抽象層抽象層與抽象類
Ø 使用數據庫抽象層的原因;
Ø 數據庫抽象層的發展;
Ø 一些流行新抽象層的介紹;
Ø PDO數據庫抽象層開發技術;
Ø ADODB數據庫抽象層開發技術。
數據庫抽象層定義
首先,代碼規劃必須規範,即整個系統使用同一個數據對象實例,並且使用同一個較好的數據庫抽象層。如果有一天用户要求將Oracle切換到MySQL,則只需要改變系統的配置文件即可。
在當今工業領域中,每個數據庫開發商如微軟、Oracle、MySQL,都有自己的一套SQL標準,它們聲稱是按照ANSI SQL92標準而增加自己的特性,以達到壟斷或佔領市場的目的。
優秀的數據庫抽象層,會根據我們使用的數據庫自動調整一些SQL性能。當沒有使用數據庫本身特定的特性時,就不必更改太多的數據庫連接和數據庫SQL查詢。
使用數據庫抽象層的其他好處是:其性質、概念簡化了複雜的任務。因此,我們不必學習某個數據庫系統的全新特性,而只用一個標準的抽象層的代碼特性即可。
雖然這是一種理想化,但隨着技術的發展,相信數據庫抽象層會為我們做更多的事。
使用PHP進行不同的數據庫系統開發,這些系統很不相同,而許多數據庫抽象層在PHP的層次有所不同,但彼此使用方法相當,它的發展無疑會提高開發效率。
請看圖17-1,觀察有數據抽象層和沒有數據抽象層的區別。
數據庫抽象層的主要性能指標是速度,由於數據庫抽象層是額外的代碼層,因為面向不同的架構與體系,因此有的效率較高,有的則相對比較慢些。
如Metabase是PHP中較慢的一個數據抽象層,它使用C語言編寫,因為它的設計與可移植性最高,而PDO和ADODB是當今世界最快的數據庫抽象類。
圖17-1
如果您非常關注系統的效率和性能,則可以按自己的基準,設置模擬環境,編寫代碼,測試每個數據庫抽象層(類)的性能。
用數據庫抽象層,意味着當從一個數據庫系統向另一個數據庫系統遷移時,幾乎不用更改太多的程序代碼,如將MS SQL Server遷移到MySQL。
數據庫抽象層常用的
有4種主流數據庫抽象層:Metabase、PEAR:DB、PDO及ADODB。
從應用來看,ADODB和PEAR:DB最受歡迎(因為PEAR是被捆綁在PHP目錄中的,但PEAR:DB的效率問題一直引人詬病)。
從PHP 5開始出現的PDO及ADODB(其中包括PDO、MySQLi的底層實現)已經逐漸普及。
也有一些更新的抽象類值得一用,PEAR:MDB(版本名稱為PEAR:MDB2)已經將Metabase和PEAR:DB合併,並且效率較之從前有很大的提高。
數據庫抽象層實例
require ‘adodb/adodb.inc.php’;
// Connect to the database
$conn = &ADONewConnection(‘mysql’);
$conn-> connect(‘localhost’,'phpgems’,'phpgems1′,’phpgems’);
// Send a SELECT query to the database
$rs = $conn-> execute(‘SELECT flavor, price, calories FROM _
ice_cream’);
// Check if any rows were returned
if ($rs-> RecordCount()> 0) {
print “”;
print “”;
// Retrieve each row
while (。 $rs->EOF) {
print “n”;
$rs-> MoveNext();
}
print “
Ice Cream Flavor | Price per Serving | Calories per Serving |
---|---|---|
{$rs->fields[0]} | {$rs->fields[1]} | {$rs->f ields[2]} |
”;
} else {
print “No results”;
}
數據庫抽象層PDO-實例
$dbms='mysql';
$host='localhost';
$dbName='test';
$user='root';
$pass='leyangjun';
$dsn="$dbms:host=$host;dbname=$dbName";
try{
$dbh=new PDO($dsn,$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND =>"set names utf8"));
echo"成功連接!
";
$result=$dbh->query('select * from timing_delivery');
//var_dump($result);
foreach($result as $row){
echo"";
print_r($row);
echo "
";
}
$dbh=null;
}catch(PDOException $e){
die("Error!連接失敗:".$e->getMessage()."
");
}