<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    piliskys

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      25 隨筆 :: 0 文章 :: 40 評(píng)論 :: 0 Trackbacks

    前言:
    如果你對(duì)hibernate不是那樣的推崇,但感覺(jué)jdbc的sqlr操作又不是那么OO的話,那么這篇文章可能給能帶來(lái)或多或少的期望…
    在很長(zhǎng)的一段時(shí)間里,中總感覺(jué)應(yīng)該對(duì)sql的操作來(lái)實(shí)現(xiàn)一種集成化,這種想法可能是來(lái)源于hibernate操作的思維吧,當(dāng)時(shí)頭腦中有一些想法:
    1,?最大程度的讓編程者對(duì)數(shù)據(jù)庫(kù)操作實(shí)現(xiàn)面向?qū)ο蟛僮鳎ㄋ械囊恍┗静僮鳎绦騿T可以不用去記住表的字段名,完全對(duì)象化,如插值,刪值,像hibernate一樣查出對(duì)多和對(duì)一的結(jié)果,把結(jié)果也對(duì)象化,一些不能實(shí)現(xiàn)的保留sql操作,)
    2,?最大程度讓sql語(yǔ)句重用,提高數(shù)據(jù)庫(kù)的效率(利用程序?qū)σ恍┎僮鱯ql的集成,保證相同操作sql的一致性)
    3,?操作要簡(jiǎn)單,容易與項(xiàng)目集成,通用(約束少)
    對(duì)于當(dāng)時(shí),頭腦中只是有這些朦朧的定義,而對(duì)于要實(shí)現(xiàn)何種方法,怎樣把對(duì)對(duì)象操作來(lái)實(shí)現(xiàn)sql的拼接(這里就是一個(gè)反的過(guò)程),心里沒(méi)底,但能夠?qū)崿F(xiàn)(只是功能的強(qiáng)弱問(wèn)題)這一點(diǎn)很清楚,其實(shí)當(dāng)時(shí)總是考慮實(shí)現(xiàn)后是否有其價(jià)值,是否對(duì)編程者有所幫助,這個(gè)是我一直沒(méi)有抽時(shí)間做的主要原因。
    正題:
    通過(guò)這幾天的一些空余時(shí)間,算完成了這個(gè)東西,不管它是否有用,只當(dāng)是自己一次練習(xí),現(xiàn)在把一些實(shí)現(xiàn)及調(diào)用的方法作個(gè)簡(jiǎn)介:
    此工具自動(dòng)生成兩種文件vo與dao,
    值對(duì)象(VO),每一個(gè)表對(duì)應(yīng)一個(gè)vo,
    vo與普通的javabean方法相同,有g(shù)et和set方法,若表A的主鍵作為表B的外鍵,那么此vo有g(shù)et B表的一個(gè)list(to-many),如果表A中引用了B 表的主鍵作為外鍵,那么它有g(shù)et B 表的一個(gè)vo,(to-one)
    數(shù)據(jù)訪問(wèn)對(duì)象(DAO),此文件對(duì)編程者是透明的,可以不作了解,主要是一些訪問(wèn)數(shù)據(jù)的方法,由公用接口調(diào)用。
    首先在你的程序中調(diào)用接口的實(shí)現(xiàn)
    DataStore ds? =???? com.piliskys.dataStore.DataManager.getInstance();
    首先申明此句并未得到數(shù)據(jù)庫(kù)的聯(lián)接,而是當(dāng)操作時(shí)才得到數(shù)據(jù)庫(kù)聯(lián)接的,而且在同一次會(huì)話中,此聯(lián)接是相同的,具體可看ConnectionUtil此類,此類可以對(duì)數(shù)務(wù)進(jìn)行設(shè)置,
    在此接口中,沒(méi)有定義提高和回滾操作,因?yàn)檫@些操作都可定義在開(kāi)發(fā)框架中,正常結(jié)束就提交,捕獲異常就回滾,
    這兩操作可直接調(diào)ConnectionUtil.currentConnection("piliskys")的操作,
    那么我們開(kāi)始介紹它的各個(gè)方法,在此為一個(gè)tb_person表為例:
    tb_person(per_name varchar2,per_age number), per_name 為主鍵
    ? 1,? public? boolean delete(Object obj)
    ? 刪除單個(gè)vo,需要設(shè)置主鍵,
    程序:刪一個(gè)叫 小李 的記錄
    DataStore ds? = com.piliskys.dataStore.DataManager.getInstance();//這里是沒(méi)有跟數(shù)據(jù)庫(kù)
    ????????? ds.delete(new TbPerson("小李"));//有主鍵的表都有此構(gòu)造方法
    ??? ConnectionUtil.currentConnection("piliskys").commit;
    ----------------------------------------------
    就這么簡(jiǎn)單,以下調(diào)用DataStore 和提交略

    ? 2,? public? int deleteByVO(Object obj)//返回刪除的記錄數(shù)
    注:如果未對(duì)obj設(shè)置任何條件將不會(huì)進(jìn)行刪除操作(因?yàn)閭€(gè)人認(rèn)為這一般是不可能的,比較危險(xiǎn),所以加以控制)
    程序:刪除姓? 李 的記錄
    ?TbPerson tp =new TbPerson();
    ?tp.setPerName("李%");
    ?ds.deleteByVO(tp);
    ----------------------------------------------
    程序:刪除年齡大于等于 19歲的記錄
    ? TbPerson tp =new TbPerson();
    ?tp.setPerAge(new Long(19),">=");//所有雙參數(shù)方法都是為一些條件選擇而用,后面一參數(shù)是用來(lái)設(shè)操作符的 > < >= <= !=,這些,方便吧
    ?ds.deleteByVO(tp);
    ----------------------------------------------
    程序:刪除年齡為空的記錄
    ? TbPerson tp =new TbPerson();
    ? tp.setPerAge(null);
    ? ds.deleteByVO(tp);
    ----------------------------------------------
    ? 3? public? int update(Object obj)
    ? 此操作必須對(duì)主鍵進(jìn)行設(shè)置,否則報(bào)錯(cuò),設(shè)置其它字段屬于為更新字段,其它字段未設(shè)置也會(huì)報(bào)錯(cuò),說(shuō)明沒(méi)有可更新的字段,
    程序 略
    ? 4? public? int update(Object src,Object tar)//兩對(duì)象必須同類(代表同一表)
    ?? 此操作 以前一對(duì)象做為條件進(jìn)行批量更新后一對(duì)象設(shè)置的值,條件如是字符串可設(shè)置帶%,條件對(duì)象也可加操作符,使用所有雙參數(shù)設(shè)置都相同,其它可設(shè)置null,對(duì)''字符串不處理
    程序 略
    ? 5? public? boolean insert(Object obj)//未進(jìn)行設(shè)置的字段為null
    程序 插入一個(gè)叫 劉德華 年齡為38的記錄
    ??? TbPerson tp =new TbPerson();
    ??? pt.setPerName("劉德華");
    ??? pt.setPerAge(new Long(38));//age為L(zhǎng)ong型的話
    ??? ds.insert(pt);
    ----------------------------------------------
    程序 插入一個(gè)叫 羅拿多 的,年齡未知
    ??? TbPerson tp =new TbPerson();
    ??? pt.setPerName("羅拿多");
    ??? ds.insert(pt);
    ----------------------------------------------
    ?6?? public? List selectAll(Class class1)
    返回所有記錄(但此處為考慮程序的效率,設(shè)置了一個(gè)最大數(shù),可參看原文件中定義的MAX_SIZE可進(jìn)行更改,
    程序 查出所有tb_person表的記錄
    ???? List list = ds.selectAll(TbPerson.class);//也簡(jiǎn)單吧
    -----------------------------------------------
    ?7?? public? void selectByPK(Object obj)
    ?根據(jù)主鍵查找記錄 ,這個(gè)是無(wú)返回值的,返回的就是本身的這個(gè)obj,為了省點(diǎn)內(nèi)存,不用多new一個(gè)對(duì)象,而且實(shí)現(xiàn)的話主鍵已經(jīng)設(shè)好,只要設(shè)其它字段,而且個(gè)人認(rèn)為這樣更好用,如果一個(gè)表無(wú)主鍵,那么查出來(lái)的就是數(shù)據(jù)庫(kù)的第一條記錄,利用 rownum=1實(shí)現(xiàn),而不是查出的第一條,最大程度地提高數(shù)據(jù)庫(kù)的效率,
    程序? 查出名叫 劉德華的記錄
    ???? TbPerson tp =new TbPerson("劉德華");
    ???? ds.selectByPK(tp);
    然后 這個(gè)tp就是一個(gè)與數(shù)據(jù)庫(kù)主鍵為劉德華的記錄,可以用它了
    -------------------------------------------------
    ?8? public? List selectByVO(Object obj)
    此方法跟上面的deleteByVO的使用基本相同,返回值是vo的一個(gè)系列,
    有一點(diǎn)不同的是,deleteByVO不設(shè)置任何查詢條件將不會(huì)做操作,而此方法不設(shè)置任何條件的話就會(huì)查出所有的(個(gè)人認(rèn)為查詢是無(wú)危害性的,要查就查吧)
    程序 參考 deleteByVO
    ?9? public? List selectByVO(Object obj, int i, int j)
    ? 此方法是上一方法的擴(kuò)充,主要是用于分頁(yè)操作,
    程序 查姓 劉 的第11條記錄到20條
    ??????? ds.selectByVO(new TbPerson("劉%"),11,20);//呵呵,感覺(jué)這樣有點(diǎn)別扭
    本應(yīng)該 TbPerson tp =new TbPerson();
    ??????????????? tp.setPerName("劉%");
    ???????? ds.selectByVO(tp,11,20);//效果一樣,
    --------------------------------------------------
    ?10? public? int sqlExcute(String s, List list)
    這個(gè)是用于直接調(diào) sql語(yǔ)句的操作,主要是執(zhí)行一些更新,刪除操作, list就是按條件順序設(shè)置的參數(shù)集,PreparedStatement的操作
    程序 略
    ? 11? public List selectBySQL(String s, List list)
    這個(gè)是用于直接調(diào) sql語(yǔ)句的操作,執(zhí)行查詢操作, list就是按條件順序設(shè)置的參數(shù)集,PreparedStatement的操作
    return? List 含map的list,key為字段全部小寫
    程序 略
    ?12? public? List selectByQuery(String s, List list)
    這個(gè)是用于直接調(diào) sql語(yǔ)句的操作,執(zhí)行查詢操作, list就是按條件順序設(shè)置的參數(shù)集,PreparedStatement的操作
    return? List 含map的list,key為字段全部小寫
    程序 略
    ? 13? public? List selectByQuery(String s, List list,int i,int j)
    同上,但主要是為了分頁(yè)操作,
    ??????? throws DAOException;

    ??? public?? void close()throws SQLException;
    數(shù)據(jù)庫(kù)聯(lián)接關(guān)閉
    關(guān)于事物提義及回滾請(qǐng)使用ConnectionUtil.currentConnection("piliskys")的操作。
    此程序支持在控制臺(tái)顯示sql語(yǔ)句,可以在配制文件中設(shè)置是否顯示,具體操作參看包中的說(shuō)明。
    ========================================================================
    當(dāng)然個(gè)人的能力是有限的,如果你認(rèn)為還應(yīng)該實(shí)現(xiàn)什么功能,程序哪方面不如人意,本人只是按照自己的觀點(diǎn),站在一個(gè)編程者的角度考慮問(wèn)題,不足之處可能很多,希望多提見(jiàn)意和建議,程序只是經(jīng)本人進(jìn)行測(cè)試,可能不是很全面,希望共同完善。
    關(guān)于如何部署于程序,包中有說(shuō)明。
    注意事項(xiàng):不支持復(fù)合主鍵作為其它表的外鍵,下次改進(jìn)吧。

    最后:請(qǐng)尊重他人成果,謝謝您的支持,本人郵箱piliskys@itpub.net希望得到你的意見(jiàn)和建議。
    ========================================================================
    此處下載原程序http://m.tkk7.com/Files/piliskys/jdbcutil.rar

    posted on 2006-03-29 13:43 霹靂火 閱讀(2631) 評(píng)論(8)  編輯  收藏

    評(píng)論

    # re: Jbdc助手-數(shù)據(jù)庫(kù)操作面向?qū)ο蟮膶?shí)現(xiàn)(oracle) 2006-03-29 14:15 scud
    普通的都好處理

    但是對(duì)于組合查詢,組合條件,多表查詢,又該如何處理哪

    DBHelper也可以很簡(jiǎn)單地實(shí)現(xiàn)這些功能,當(dāng)然這些我早就想過(guò):包括直接insert,update,delete一個(gè)對(duì)象

    但是對(duì)于一個(gè)對(duì)象很簡(jiǎn)單,但是同時(shí)delete,update多個(gè)對(duì)象就不好處理了。至于你的兩個(gè)參數(shù)的設(shè)置條件,我覺(jué)得不是很優(yōu)雅。

      回復(fù)  更多評(píng)論
      

    # re: Jbdc助手-數(shù)據(jù)庫(kù)操作面向?qū)ο蟮膶?shí)現(xiàn)(oracle) 2006-03-29 14:28 霹靂火
    但是對(duì)于組合查詢,組合條件,多表查詢,又該如何處理哪
    --------------------------------------------------------------
    我想上面的東西還是要用sql直接處理吧,sql可以千變?nèi)f化,對(duì)象化是很難實(shí)現(xiàn)的,表表關(guān)聯(lián)的更不用說(shuō),我只是最大程度把關(guān)系對(duì)象化,
    當(dāng)時(shí)我也考慮不要兩個(gè)參數(shù)的設(shè)置是否值得加入,但就算在單表查詢中這種條件也是很多的,所以加入了,
    DBHelper中加入了表的原始字段,我原先就覺(jué)得這點(diǎn)不好,當(dāng)然個(gè)人的思考問(wèn)題是不同的,看問(wèn)題的方面也可能不同,
    做這東西只是為了探討其中的一些問(wèn)題及方法,并不是為了得到一個(gè)肯定或其它之類的東西,
    最后,謝謝你的回復(fù),  回復(fù)  更多評(píng)論
      

    # re: Jbdc助手-數(shù)據(jù)庫(kù)操作面向?qū)ο蟮膶?shí)現(xiàn)(oracle) 2006-03-30 12:36 rox
    比較支持你的想法,因?yàn)橛杏眠^(guò)DB4O,很類似。
    很多用過(guò)DB4O的,也會(huì)問(wèn)如何才能實(shí)現(xiàn)SQL查詢里面的一些特性。
    因?yàn)榇蠹乙呀?jīng)習(xí)慣了關(guān)系型數(shù)據(jù)庫(kù),如何突破,我也很困惑。呵呵。  回復(fù)  更多評(píng)論
      

    # re: Jbdc助手-數(shù)據(jù)庫(kù)操作面向?qū)ο蟮膶?shí)現(xiàn)(oracle) 2006-04-02 20:34 劍事
    感覺(jué)不夠通用  回復(fù)  更多評(píng)論
      

    # re: Jbdc助手-數(shù)據(jù)庫(kù)操作面向?qū)ο蟮膶?shí)現(xiàn)(oracle) 2006-04-03 08:40 霹靂火
    不知樓上在這方面有什么好的建議,一句話很簡(jiǎn)練,但除了打消別人的積級(jí)性這外,好象沒(méi)有啟到任何作用啊,希望得到一些具體的建議  回復(fù)  更多評(píng)論
      

    # re: Jbdc助手-數(shù)據(jù)庫(kù)操作面向?qū)ο蟮膶?shí)現(xiàn)(oracle) 2006-04-04 16:50 Terry的回答
    我一直有個(gè)疑惑:用SQL不好嗎?學(xué)習(xí)SQL的成本應(yīng)該遠(yuǎn)小于學(xué)習(xí)各種工具的成本(比如Hibernate)  回復(fù)  更多評(píng)論
      

    # re: Jbdc助手-數(shù)據(jù)庫(kù)操作面向?qū)ο蟮膶?shí)現(xiàn)(oracle) 2006-04-05 08:57 霹靂火
    如果把一個(gè)工具集成化后,那么學(xué)習(xí)它的成本應(yīng)該是很低的,我們的初衷是只要懂java基礎(chǔ)就能用這些工具,至于能不能達(dá)到這種要求,那是我們一直所追求的。
    直接用sql:
    1,sql的重用效率不高,各個(gè)程序員很難寫出一致的sql。
    2,操作上有時(shí)會(huì)較復(fù)雜,如一條插入語(yǔ)句遠(yuǎn)比面向?qū)ο蟛僮鲝?fù)雜。
    3,數(shù)據(jù)庫(kù)關(guān)系的操作與程序面向?qū)ο蟛僮鞑灰恢隆?
    當(dāng)然很多數(shù)據(jù)庫(kù)操作面向?qū)ο蠛茈y實(shí)現(xiàn),可能必須用sql來(lái)直接實(shí)現(xiàn)。但基于數(shù)據(jù)庫(kù)2080原則,我們對(duì)其中一些sql操作面向?qū)ο蠡ㄈ缫恍﹩伪聿迦搿h除、更新等),可能這此在sql語(yǔ)句中只占20%,但它們的操作頻率可能占80%。因此,個(gè)人感覺(jué)這種集成是有必要的。  回復(fù)  更多評(píng)論
      

    # re: Jbdc助手-數(shù)據(jù)庫(kù)操作面向?qū)ο蟮膶?shí)現(xiàn)(oracle) 2006-11-03 15:12 he
    我覺(jué)得還是不要搞這樣的高不成低不就的東西,因?yàn)檫@些東西做小應(yīng)用不如直接采用jdbc簡(jiǎn)單,搞復(fù)雜的東西又滿足不了應(yīng)用,不過(guò)還是比較鼓勵(lì)思考的。謹(jǐn)慎值得鼓勵(lì)!!  回復(fù)  更多評(píng)論
      


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日本亚洲色大成网站www久久| 亚洲成人免费在线观看| 亚洲第一中文字幕| 亚洲国产日韩在线| 亚洲欧美日韩中文无线码 | 亚洲三级高清免费| 免费特级黄毛片在线成人观看| 亚洲VA综合VA国产产VA中| 亚洲人成人77777网站| 亚洲理论片中文字幕电影| 亚洲男人的天堂网站| 成人在线免费视频| 免费国产午夜高清在线视频| 成年在线观看网站免费| 四虎1515hm免费国产| 亚洲av伊人久久综合密臀性色| 亚洲一级片在线观看| 污视频网站免费观看| 三年片在线观看免费观看大全动漫| 亚洲免费网站观看视频| 亚洲精品偷拍视频免费观看| 亚洲AV日韩精品久久久久久| 亚洲国产成人久久精品大牛影视| a毛片免费全部在线播放**| 无码国产精品一区二区免费I6| 亚洲午夜无码片在线观看影院猛| 91精品国产亚洲爽啪在线影院| 国产精品亚洲综合网站| 麻豆成人久久精品二区三区免费| 日本久久久免费高清| 亚洲国产精品自在线一区二区| 亚洲人av高清无码| 免费A级毛片av无码| 国产一级淫片免费播放| 久久精品亚洲一区二区三区浴池 | 亚洲网站在线观看| 日韩久久无码免费毛片软件| 麻花传媒剧在线mv免费观看| 亚洲国产精品嫩草影院久久 | 亚洲视频在线视频| 四虎国产精品成人免费久久|