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

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

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

    piliskys

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      25 隨筆 :: 0 文章 :: 40 評論 :: 0 Trackbacks

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

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

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

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

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

    評論

    # re: Jbdc助手-數據庫操作面向對象的實現(oracle) 2006-03-29 14:15 scud
    普通的都好處理

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

    DBHelper也可以很簡單地實現這些功能,當然這些我早就想過:包括直接insert,update,delete一個對象

    但是對于一個對象很簡單,但是同時delete,update多個對象就不好處理了。至于你的兩個參數的設置條件,我覺得不是很優雅。

      回復  更多評論
      

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

    # re: Jbdc助手-數據庫操作面向對象的實現(oracle) 2006-03-30 12:36 rox
    比較支持你的想法,因為有用過DB4O,很類似。
    很多用過DB4O的,也會問如何才能實現SQL查詢里面的一些特性。
    因為大家已經習慣了關系型數據庫,如何突破,我也很困惑。呵呵。  回復  更多評論
      

    # re: Jbdc助手-數據庫操作面向對象的實現(oracle) 2006-04-02 20:34 劍事
    感覺不夠通用  回復  更多評論
      

    # re: Jbdc助手-數據庫操作面向對象的實現(oracle) 2006-04-03 08:40 霹靂火
    不知樓上在這方面有什么好的建議,一句話很簡練,但除了打消別人的積級性這外,好象沒有啟到任何作用啊,希望得到一些具體的建議  回復  更多評論
      

    # re: Jbdc助手-數據庫操作面向對象的實現(oracle) 2006-04-04 16:50 Terry的回答
    我一直有個疑惑:用SQL不好嗎?學習SQL的成本應該遠小于學習各種工具的成本(比如Hibernate)  回復  更多評論
      

    # re: Jbdc助手-數據庫操作面向對象的實現(oracle) 2006-04-05 08:57 霹靂火
    如果把一個工具集成化后,那么學習它的成本應該是很低的,我們的初衷是只要懂java基礎就能用這些工具,至于能不能達到這種要求,那是我們一直所追求的。
    直接用sql:
    1,sql的重用效率不高,各個程序員很難寫出一致的sql。
    2,操作上有時會較復雜,如一條插入語句遠比面向對象操作復雜。
    3,數據庫關系的操作與程序面向對象操作不一致。
    當然很多數據庫操作面向對象很難實現,可能必須用sql來直接實現。但基于數據庫2080原則,我們對其中一些sql操作面向對象化(如一些單表插入、刪除、更新等),可能這此在sql語句中只占20%,但它們的操作頻率可能占80%。因此,個人感覺這種集成是有必要的。  回復  更多評論
      

    # re: Jbdc助手-數據庫操作面向對象的實現(oracle) 2006-11-03 15:12 he
    我覺得還是不要搞這樣的高不成低不就的東西,因為這些東西做小應用不如直接采用jdbc簡單,搞復雜的東西又滿足不了應用,不過還是比較鼓勵思考的。謹慎值得鼓勵??!  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国内精品99亚洲免费高清| 亚洲国产成a人v在线| 亚洲国产精品无码久久| 18国产精品白浆在线观看免费| 亚洲日韩欧洲乱码AV夜夜摸 | 最近免费中文字幕mv电影| 国产亚洲精品观看91在线| 日韩电影免费在线观看中文字幕| 国产免费看JIZZ视频| 亚洲国产精品成人综合久久久| 亚洲啪啪免费视频| 国产成人精品曰本亚洲79ren| 黄色免费网站在线看| 国产av无码专区亚洲国产精品| eeuss草民免费| 亚洲AV无码不卡在线播放| 亚洲国产精品美女久久久久| 麻豆成人精品国产免费| 日本激情猛烈在线看免费观看| 国产AⅤ无码专区亚洲AV| 国产精品偷伦视频观看免费 | 亚洲无码黄色网址| 日韩电影免费在线观看| 亚洲日韩乱码中文无码蜜桃臀| 免费精品人在线二线三线区别| 国产亚洲精品AAAA片APP| 99在线精品视频观看免费| 亚洲18在线天美| 免费又黄又硬又爽大片| 国产在线播放线91免费| 亚洲欧洲国产精品久久| 国产免费av一区二区三区| 亚洲中文字幕乱码AV波多JI| 亚洲免费视频在线观看| 亚洲色欲色欲www在线丝| 99re6免费视频| 国产精品亚洲片在线花蝴蝶| 亚洲中文字幕无码永久在线| 亚洲免费在线观看视频| 暖暖免费中文在线日本| 久久久亚洲欧洲日产国码二区|