複製鏈接
請複製以下鏈接發送給好友

DAO

(軟件程序架構專業術語,意為數據庫訪問對象)

鎖定
DAO(Data Access Object) 數據訪問對象是一個面向對象的數據庫接口,它顯露了 Microsoft Jet 數據庫引擎(由 Microsoft Access 所使用),並允許 Visual Basic 開發者通過 ODBC 像直接連接到其他數據庫一樣,直接連接到 Access 表。DAO 最適用於單系統應用程序或小範圍本地分佈使用。
中文名
數據訪問對象
外文名
Data Access Object
簡    稱
DAO
侷限性
適用於單系統應用程序

DAO訪問接口

DAO(Data Access Object)是一個數據訪問接口,數據訪問:顧名思義就是與數據庫打交道。夾在業務邏輯與數據庫資源中間。
DAO DAO
在核心J2EE模式中是這樣介紹DAO模式的:為了建立一個健壯的J2EE應用,應該將所有對數據源的訪問操作抽象封裝在一個公共API中。用程序設計的語言來説,就是建立一個接口,接口中定義了此應用程序中將會用到的所有事務方法。在這個應用程序中,當需要和數據源進行交互的時候則使用這個接口,並且編寫一個單獨的類來實現這個接口在邏輯上對應這個特定的數據存儲

DAO訪問對象

DAO(數據訪問對象)是一種應用程序編程接口(API),存在於微軟Visual Basic中,它允許程序員請求對微軟的Access數據庫的訪問。DAO是微軟的第一個面向對象的數據庫接口。DAO對象封閉了Access的Jet函數。通過Jet函數,它還可以訪問其他的結構化查詢語言(SQL)數據庫。
J2EE開發人員使用數據訪問對象(DAO)設計模式把底層的數據訪問邏輯和高層的業務邏輯分開.實現DAO模式能夠更加專注於編寫數據訪問代碼.
我們先來回顧一下DAO設計模式和數據訪問對象.
DAO基礎
DAO模式是標準的J2EE設計模式之一.開發人員使用這個模式把底層的數據訪問操作和上層的商務邏輯分開.一個典型的DAO實現有下列幾個組件:
1. 一個DAO工廠類
2. 一個DAO接口;
3. 一個實現DAO接口的具體類
4. 數據傳遞對象(有些時候叫做值對象).
具體的DAO類包含了從特定的數據源訪問數據的邏輯。在下面的這段中你將學到設計和實現數據訪問對象的技術。
事務劃分:
關於DAO要記住的一件重要事情是它們是事務性對象。每個被DAO執行的操作(對象創建,更新、或刪除數據)都是和事務相關聯的。同樣的,事務劃分(transaction demarcation)的概念是特別重要的。
事務劃分是在事務界定定義中的方式。J2EE規範為事務劃分描述了兩種模式:編程性事務(programmatic)和聲明性事務(declarative).下表是對這兩種模式的拆分:
聲明性事務劃分 編程性事務劃分
程序員使用EJB的部署描述符聲明事務屬性 程序員擔負編寫事務邏輯代碼的責任。
運行時環境(EJB容器)使用這些屬性來自動的管理事務。應用程序通過一個API接口來控制事務。

DAO寫盤方式

除去Data Access Object的意思,在光盤刻錄方面DAO對應於Disk At Once(一次寫盤方式),在使用刻錄機刻錄鏡像文件時可以選擇這種方式。
一次寫盤是單次的寫入方式引導區、數據磁道以及導出區都是一次性寫入,一次寫完之後光盤就關閉,即便此次寫入沒有寫滿整個刻錄盤,也無法再寫入其它數據。當引導區寫入到光盤上時,並沒有在該引導區標示出下一個可用的地址,因此光盤就被視為關閉,再也無法寫入更多的數據。
這種寫入模式主要用於光盤的複製,一次完成整張光盤的刻錄。其特點是能使複製出來的光盤與源盤毫無二致。DAO寫入方式可以輕鬆完成對於音樂CD、混合或特殊類型CD-ROM等數據軌之間存在間隙的光盤的複製,且可以確保數據結構與間隙長度都完全相同。值得一提的是,由於DAO寫入方式把整張光盤當作一個區段來處理,一些小的失誤都有可能導致整張光盤徹底報廢,所以它對數據傳送的穩定性和驅動器的性能有較高的要求。

DAO應用

一、數據訪問對象DAO的結構
上一章我們知道了DAO是什麼,它可以幹什麼,以及簡單的瞭解了它是如何實現這一功能,這一章我們講逐步學習DAO的結構。在將講這一章之前,首先講兩個題外話:
大家對面向對象編程一定不陌生,但究竟什麼是面向對象編程,很多人一下子也説不出個所以然來;在VB的DAO中又是如何體現面向對象的呢,恐怕即便是使用了一段VB的網友也很難説清。這也難怪,VB本身並不是個完全的面向對象的編程環境,它的很多如動態數組等就不是面向對象的,但在DAO中是完全的面向對象的。其實面向對象的最初思想就是將數據和操作封裝在一起,形成對象,而在DAO中正是體現了這一點,它將數據的值作為屬性,數據的查詢作為方法,數據值的變化作為事件,完全封裝在DAO對象中,希望諸位盟友在使用中注意,逐步領悟面向對象的編程方法。
數據庫前端開發系統和後台系統
經常由朋友説他會DELPHI,會PB,實際上用前端和後台的概念來看,他們都只是會一種前端開發工具而已,嚴格説起來並不能算會數據庫的開發。人們往往只看到前台應用的功能而忽視了後台系統的應用,或者認為這兩者根本就是一回事。前端後台概念用在單機上,就是VB與Access,用在網絡中就是VB與SQLSever,只會VB或DELPHI是不能稱為掌握數據庫編程的,而且在編程中,要善於利用後台數據庫提供功能,這樣的程序運行起來更快,程序更精練。
二、數據訪問對象DAO的功能
1. DAO用來封裝Data Source的..就比如,Connection conn = DAOFactory.createConnection()..
就可以把Driver. URL. username,passpword這一些放在DAO中
以後要更改數據庫的類型.比如要把MYSQL換成Oracle的話..只需要更改DAOFactory裏面的getConnection()裏面的Driver.URL.之類的..
2. DAO也是把對數據庫的操作(比如最基本的CRUD操作)全部封裝在裏面..
比如説你要插入一個新的用户..那麼.在DAO中我們只需要提供一個insertUser(User user)這一個方法就可以了..具體的操作是在DAO中實現的...
那麼對於要調用DAO的時候.我們只要知道insertUser(User)是用來插入一個新的用户...而不需要知道是如何實現的..
一般 DAO是與Abstract Factory模式一起來用的...
Factory來建立數據庫和定位具體的DAO(比如説是UserDao..CustomerDao..)..一般將getConnection設置為static..也可以把HibernateSessionFactory這一個公共類放在這一AbstractFactory類中去...
public class DAOFactory {
private static final SessionFactory sessionFactory;
// 定義一個ThreadLocal .
static Session currentSession().....
public UserDao getUserDAO() { return new UserDaoImpl(sesssion);}
pulbic OtherDao getOtherDAO() { return new OtherDaoImpl(session);}
......
}
public interface UserDao {
public insertUser(FormBean)
public updateUser(FormBean);
}
然後就實現DAO的接口: (Struts的FormBean...VO來的..)
publicclassUserDaoImpl implements UserDao {
privateSession session;
public UserDaoImpl(Session session){
this.session = session;
}...
public insertUser(FormBean) {
..//..
session.save(UserPO);
..//..
return FormBean;
}
public FormBean updateUser(FormBean) {
..//..
session.update(UserPO);
..//..
return FormBean;
}
}
最後定義你的PO:
publicclassUserPO {
String firstname,lastname,password..........
}
Huhmmmm..........
三、實戰應用——使用數據訪問對象DAO
1 概述
Visual C++提供了對DAO的封裝,MFC DAO類封裝了DAO(數據庫訪問對象)的大部分功能,從而Visual C++程序就可以使用Visual C++提供的MFC DAO類方便的訪問Microsoft Jet 數據庫,編制簡潔、有Visaul C++特色的數據庫應用程序。
數據庫訪問對象(DAO)提供了一種通過程序代碼創建和操縱數據庫的機制。多個DAO對象構成一個體系結構,在這個結構裏,各個DAO對象協同工作。DAO支持以下四個數據庫選項:
打開訪問數據庫(MDB文件)——MDB文件是一個自包含的數據庫,它包括查詢定義、安全信??須指定MDB文件的路徑名。
直接打開ODBC數據源——這裏有一個很重要的限制。不能找開以Jet引擎作為驅動程序的ODBC數據源;只可以使用具有自己的ODBC驅動程序DLL的數據源。
用Jet引擎找開ISAM型(索引順序訪問方法數據源(包括dBase,FoxPro,Paradox,Btrieve,Excel文本文件)——即使已經設置了ODBC數據源,要用Jet引擎來訪問這些文件類型中的一種,也必須以ISAM型數據源的方式來找開文件,而不是以ODBC數據源的方式。
ACCESS數據庫附加外部表——這實際上是用DAO訪問ODBC數據源的首選方法。首先使用ACCESS把ODBC表添加到一個MDB文件上,然後依照第一選項中介紹的方法用DAO找開這個MDB文件就可以了。用户也可以用ACCESS把IASM文件附加到一個MDB文件上。
2 應用DAO編程
2.1 打開數據庫
CDaoWorkspace對象代表一個DAO Workspace對象,在MFC DAO體系結構中處於最高處,定義了一個用户的同數據庫的會話,幷包含打開的數據庫,負責完成數據庫的事務處理。我們可以使用隱含的workspace對象。
CDaoDatabase對象代表了一個到數據庫的連接,在MFC中,是通過CDaoDatabase封裝的。
在構造CDaoDatabase對象時,有如下兩種方法:
創建一個CDaoDatabase對象,並向其傳遞一個指向一個已經找開的CdaoWorkspace對象的指針。
創建一個CDaoDatabase對象,而不明確地指定使用的workspace,此時,MFC將創建一個新的臨時的CDaoWorkspace對象。
如下代碼所示:
CDaoDatabasedb;
db.Open(“test.mdb”,FALSE,FALSE,_T(“”);
其中參數一包括要打開的文件的全路徑名。
2.2 查詢記錄
一個DAO recordset對象,代表一個數據記錄的集合,該集合是一個庫表或者是一個查詢的運行結果中的全部記錄。CDaoRecorset對象有三種類型:表、動態集、快照。
通常情況下,我們在應用程序中可以使用CDaoRecordset導出類,這一般是通過ClassWizardAppWizard來生成的。但我們也可以直接使用CDaoRecordset類生成的對象。此時,我們可以動態地綁定recordset對象的數據成員
如下代碼所示:
long id;
CString str;
CDaoRecordset m_Set(&db);
m_Set.Open(“查詢的SQL語句”);
while(!m_Set.IsEOF())
{
/*
處理
m_Set.GetFieldValue(“ID”,var);
id=V_I4(var);
m_Set.GetFieldValue(“Name”,var);
str=var.pbVal;
*/
m_Set.MoveNext();
}
m_Set.Close();
2.3 添加記錄
添加記錄用AddNew函數,此時用SetFieldValue來進行賦值。
如下代碼所示:
m_pDaoRecordset->AddNew ();
sprintf(strValue,"%s",>m_UserName );
m_pDaoRecordset->SetFieldValue ("UserName",strValue);
sprintf(strValue,"%d",m_PointId );
m_pDaoRecordset->SetFieldValue ("PointId",strValue);
dataSrc.SetDateTime (m_UpdateTime .GetYear ),m_UpdateTime .GetMonth ),m_UpdateTime .GetDay (),
m_UpdateTime .GetHour (),m_UpdateTime .GetMinute (),m_UpdateTime .GetSecond ());
valValue=dataSrc;
m_pDaoRecordset->SetFieldValue ("UpdateTime",valValue);
sprintf(strValue,"%f",m_pRecordset->m_OldValue );
m_pDaoRecordset->SetFieldValue ("OldValue",strValue);
sprintf(strValue,"%f",m_pRecordset->m_NewValue );
m_pDaoRecordset->SetFieldValue ("NewValue",strValue);
m_pDaoRecordset->Update ();
此時,要注意,日期時間型數據要用SetDataTime函數來賦值,這裏面要用到COleVariant類型數據,具體用法可以參考有關幫助。
2.4 修改記錄
修改記錄用Edit()函數,把記錄定位到要修改的位置,調用Edit函數,修改完成後,調用Update函數。
如下代碼所示:
m_Set.Edit();
m_Set.SetFieldValue(“列名”,”字符串”);
m_Set.Update();
2.5 刪除記錄
刪除記錄用Delete()函數,使用後不需調用Update()函數。
2.6 統計記錄
可以使用如下代碼來統計記錄數:
COleVariant varValue;
CDaoRecordset m_Set(&db);
m_Set.Open(dbOpenDynaset,”SQL語句”);
varValue=m_Set.GetFieldValue(0);
m_lMaxCount=V_I4(&varValue);
m_Set.Close();
如果是統計一張表中總記錄,可以使用CDaoTableDef對象,如下代碼所示:
CDaoTableDefm_Set(&gUseDB);
Count=m_Set.GetRecordCount();
m_Set.Close();
不能用CDaoRecordset對象的GetRecordCount()來取得記錄數。
3 總結
使用DAO技術可以使我們方便的訪問Microsoft Jet引擎數據庫,由於Microsoft Jet不支持多線程,因此,必須限制調用到應用程序主線程的所有DAO。(來源CNET Networks )