畢業(yè)設(shè)計(jì)開發(fā)日記連載4:DAO模式和面向接口編程
Posted on 2007-02-27 17:48 冰浪 閱讀(2281) 評(píng)論(3) 編輯 收藏 所屬分類: WEB開發(fā)
???? DAO
是
Date Access Object
的縮寫,就是數(shù)據(jù)訪問對(duì)象。
DAO
模式就是將對(duì)數(shù)據(jù)庫的操作都封裝成一個(gè)類,在需要進(jìn)行數(shù)據(jù)存取時(shí)就直接調(diào)用
Dao
類實(shí)例對(duì)象來完成的一種工作方式,這也是面向?qū)ο缶幊痰囊环N體現(xiàn)。
在
CSUOA
中,我將數(shù)據(jù)庫里每一個(gè)表都對(duì)應(yīng)一個(gè)實(shí)體
Entity
,而每一個(gè)
Entity
都對(duì)應(yīng)著一個(gè)
Dao
的實(shí)例類,用于進(jìn)行相應(yīng)的操作。
如
CSUOA
數(shù)據(jù)庫里有
oauser
,
mail
,
message
等表,分別代表用戶表,郵件表,短信息表。那么我就對(duì)應(yīng)著有
OauserDao.class
,
MailDao.class
,
MessageDao.class
等
Dao
實(shí)例類。而我們知道,數(shù)據(jù)庫操作中最基本的就是增刪改,這也是共性,所以我將增刪改操作抽象出來,建立一個(gè)
Dao
抽象類
BaseDao.class
,作為
Dao
實(shí)例類的父類,其類方法可為增刪改的抽象方法或?qū)嵗椒ǎ唧w要根據(jù)數(shù)據(jù)持久操作的底層實(shí)現(xiàn)來確定。當(dāng)然,進(jìn)一步來說,獲取對(duì)象也是基本的操作,在這里省略了。
那么,到這里就完成了嗎?沒有!按照面向接口編程的原則,我再建立一個(gè)
Dao
接口:
Dao.class
作為抽象類
BaseDao.class
的父類。而在
Dao.class
里,我們只聲明了增刪改的無任何實(shí)現(xiàn)的抽象方法。
接口不能實(shí)例化,定義了接口又怎么用呢?對(duì),接口是不能實(shí)例化,但我們可以聲明一個(gè)接口類型的引用。也就是創(chuàng)建一個(gè)
Dao
實(shí)例對(duì)象,但聲明其類型為
Dao
接口類型。例如:
Dao dao = new OauserDao();
這樣有何意義呢?是因?yàn)閷?duì)松耦合的要求,這點(diǎn)我們?cè)谙缕僭敿?xì)說明。
除了要進(jìn)行基本的增刪改操作外,有些
Entity
還要進(jìn)行其它一些操作,如查詢。我首先想到的是,在
OauserDao.class
里擴(kuò)展功能,加入查詢方法,以致于可以進(jìn)行查詢操作。即在
Dao dao = new OauserDao();
后用
dao.query(“queryStr”);
進(jìn)行查詢操作,但此時(shí),編譯器報(bào)錯(cuò)了,說“沒有為
Dao
定義
query()
方法”。想想也對(duì),將
dao
聲明為
Dao
類型,編譯器就以
Dao
類型所擁有的方法進(jìn)行編譯,但此時(shí)編譯器無法在
Dao
接口類里找到此方法,所以報(bào)錯(cuò)了。
幾經(jīng)思考后,想到可以這么做:新建立一個(gè)
Query.class
的接口類,并聲明查詢方法,然后在
Dao
實(shí)例類如
OauserDao.class
里實(shí)現(xiàn)
Query
接口。我們知道,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,這就是接口的優(yōu)勢(shì)。在要進(jìn)行查詢操作時(shí),我們將之前
dao
實(shí)例對(duì)象聲明為
Query
類型,此時(shí)就通過了編譯并實(shí)現(xiàn)了我所要的結(jié)果。
我以前寫程序,根本就不會(huì)去用接口,也不明白接口有什么用,也不會(huì)去用抽象類,動(dòng)手就是實(shí)例類,最多也就是用到繼承,以為這就是面向?qū)ο罅恕倪@可以看我的面向?qū)ο蠡A(chǔ)不太好,我覺得很大程度是因?yàn)槲覀兇髮W(xué)里所用教材的原因,教材里所寫的就只是一些語法。而自己又是大三下學(xué)期才決定轉(zhuǎn)入
Java
方向的,所以深深知道自己要學(xué)習(xí)的東西太多太多。在大四時(shí)我就決定好好補(bǔ)上這一課,而當(dāng)我在網(wǎng)上看到孫衛(wèi)琴的《
Java
面向?qū)ο缶幊獭愤@本書并預(yù)讀了其中一章內(nèi)容時(shí),我馬上做出了買書的決定!因?yàn)檫@本書剛出版的原因,我沒有在惠州買到,所以就托我哥在順德買了下來,拿到手后如獲至寶。現(xiàn)在,我已經(jīng)基本上看完了這本書,明白了很多東西,覺得自己的面向?qū)ο笏枷胍呀?jīng)達(dá)到了一個(gè)質(zhì)的飛躍。在此我要特別感謝