冰浪

          哥已不再年輕 - 堅(jiān)定夢(mèng)想,畢生追求!
          posts - 85, comments - 90, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          ???? 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ì)的飛躍。在此我要特別感謝孫衛(wèi)琴老師,給我們寫了一本這么好的書。也是因?yàn)檫@些,我才可以寫下這篇開發(fā)日記,算是有點(diǎn)東西的東西。


          評(píng)論

          # re: 畢業(yè)設(shè)計(jì)開發(fā)日記連載4:DAO模式和面向接口編程  回復(fù)  更多評(píng)論   

          2007-02-28 09:32 by 我為J狂
          “Dao.class 作為抽象類 BaseDao.class 的父類”這句話不太準(zhǔn)確,應(yīng)該這樣闡述“BaseDao實(shí)現(xiàn)了Dao接口”。

          # re: 畢業(yè)設(shè)計(jì)開發(fā)日記連載4:DAO模式和面向接口編程  回復(fù)  更多評(píng)論   

          2007-03-02 08:53 by 壞男孩
          孫JJ寫的書真的值得一睹

          # re: 畢業(yè)設(shè)計(jì)開發(fā)日記連載4:DAO模式和面向接口編程  回復(fù)  更多評(píng)論   

          2007-03-14 10:57 by L
          persistent層最好還是需要一個(gè)框架,尤其是到最后你需要transaction management的時(shí)候。
          主站蜘蛛池模板: 新建县| 高阳县| 绥江县| 通山县| 新昌县| 长阳| 小金县| 四平市| 大同市| 南阳市| 孝昌县| 岳阳市| 仪陇县| 新宁县| 郯城县| 舟山市| 密山市| 故城县| 会理县| 定日县| 桐柏县| 蛟河市| 西乡县| 仁化县| 灵寿县| 和静县| 武鸣县| 唐山市| 湘乡市| 香格里拉县| 阿瓦提县| 普洱| 梅河口市| 华宁县| 和龙市| 嘉善县| 九江市| 天柱县| 兴业县| 梁河县| 铜梁县|