Posted on 2007-02-27 17:48
冰浪 閱讀(2274)
評論(3) 編輯 收藏 所屬分類:
WEB開發
???? DAO
是
Date Access Object
的縮寫,就是數據訪問對象。
DAO
模式就是將對數據庫的操作都封裝成一個類,在需要進行數據存取時就直接調用
Dao
類實例對象來完成的一種工作方式,這也是面向對象編程的一種體現。
在
CSUOA
中,我將數據庫里每一個表都對應一個實體
Entity
,而每一個
Entity
都對應著一個
Dao
的實例類,用于進行相應的操作。
如
CSUOA
數據庫里有
oauser
,
mail
,
message
等表,分別代表用戶表,郵件表,短信息表。那么我就對應著有
OauserDao.class
,
MailDao.class
,
MessageDao.class
等
Dao
實例類。而我們知道,數據庫操作中最基本的就是增刪改,這也是共性,所以我將增刪改操作抽象出來,建立一個
Dao
抽象類
BaseDao.class
,作為
Dao
實例類的父類,其類方法可為增刪改的抽象方法或實例方法,具體要根據數據持久操作的底層實現來確定。當然,進一步來說,獲取對象也是基本的操作,在這里省略了。
那么,到這里就完成了嗎?沒有!按照面向接口編程的原則,我再建立一個
Dao
接口:
Dao.class
作為抽象類
BaseDao.class
的父類。而在
Dao.class
里,我們只聲明了增刪改的無任何實現的抽象方法。
接口不能實例化,定義了接口又怎么用呢?對,接口是不能實例化,但我們可以聲明一個接口類型的引用。也就是創建一個
Dao
實例對象,但聲明其類型為
Dao
接口類型。例如:
Dao dao = new OauserDao();
這樣有何意義呢?是因為對松耦合的要求,這點我們在下篇再詳細說明。
除了要進行基本的增刪改操作外,有些
Entity
還要進行其它一些操作,如查詢。我首先想到的是,在
OauserDao.class
里擴展功能,加入查詢方法,以致于可以進行查詢操作。即在
Dao dao = new OauserDao();
后用
dao.query(“queryStr”);
進行查詢操作,但此時,編譯器報錯了,說“沒有為
Dao
定義
query()
方法”。想想也對,將
dao
聲明為
Dao
類型,編譯器就以
Dao
類型所擁有的方法進行編譯,但此時編譯器無法在
Dao
接口類里找到此方法,所以報錯了。
幾經思考后,想到可以這么做:新建立一個
Query.class
的接口類,并聲明查詢方法,然后在
Dao
實例類如
OauserDao.class
里實現
Query
接口。我們知道,一個類可以實現多個接口,這就是接口的優勢。在要進行查詢操作時,我們將之前
dao
實例對象聲明為
Query
類型,此時就通過了編譯并實現了我所要的結果。
?
我以前寫程序,根本就不會去用接口,也不明白接口有什么用,也不會去用抽象類,動手就是實例類,最多也就是用到繼承,以為這就是面向對象了。從這可以看我的面向對象基礎不太好,我覺得很大程度是因為我們大學里所用教材的原因,教材里所寫的就只是一些語法。而自己又是大三下學期才決定轉入
Java
方向的,所以深深知道自己要學習的東西太多太多。在大四時我就決定好好補上這一課,而當我在網上看到孫衛琴的《
Java
面向對象編程》這本書并預讀了其中一章內容時,我馬上做出了買書的決定!因為這本書剛出版的原因,我沒有在惠州買到,所以就托我哥在順德買了下來,拿到手后如獲至寶。現在,我已經基本上看完了這本書,明白了很多東西,覺得自己的面向對象思想已經達到了一個質的飛躍。在此我要特別感謝孫衛琴老師,給我們寫了一本這么好的書。也是因為這些,我才可以寫下這篇開發日記,算是有點東西的東西。