前言:
如果你對hibernate不是那樣的推崇,但感覺jdbc的sqlr操作又不是那么OO的話,那么這篇文章可能給能帶來或多或少的期望…
在很長的一段時間里,中總感覺應(yīng)該對sql的操作來實現(xiàn)一種集成化,這種想法可能是來源于hibernate操作的思維吧,當(dāng)時頭腦中有一些想法:
1,?最大程度的讓編程者對數(shù)據(jù)庫操作實現(xiàn)面向?qū)ο蟛僮鳎ㄋ械囊恍┗静僮鳎绦騿T可以不用去記住表的字段名,完全對象化,如插值,刪值,像hibernate一樣查出對多和對一的結(jié)果,把結(jié)果也對象化,一些不能實現(xiàn)的保留sql操作,)
2,?最大程度讓sql語句重用,提高數(shù)據(jù)庫的效率(利用程序?qū)σ恍┎僮鱯ql的集成,保證相同操作sql的一致性)
3,?操作要簡單,容易與項目集成,通用(約束少)
對于當(dāng)時,頭腦中只是有這些朦朧的定義,而對于要實現(xiàn)何種方法,怎樣把對對象操作來實現(xiàn)sql的拼接(這里就是一個反的過程),心里沒底,但能夠?qū)崿F(xiàn)(只是功能的強弱問題)這一點很清楚,其實當(dāng)時總是考慮實現(xiàn)后是否有其價值,是否對編程者有所幫助,這個是我一直沒有抽時間做的主要原因。
正題:
通過這幾天的一些空余時間,算完成了這個東西,不管它是否有用,只當(dāng)是自己一次練習(xí),現(xiàn)在把一些實現(xiàn)及調(diào)用的方法作個簡介:
此工具自動生成兩種文件vo與dao,
值對象(VO),每一個表對應(yīng)一個vo,
vo與普通的javabean方法相同,有g(shù)et和set方法,若表A的主鍵作為表B的外鍵,那么此vo有g(shù)et B表的一個list(to-many),如果表A中引用了B 表的主鍵作為外鍵,那么它有g(shù)et B 表的一個vo,(to-one)
數(shù)據(jù)訪問對象(DAO),此文件對編程者是透明的,可以不作了解,主要是一些訪問數(shù)據(jù)的方法,由公用接口調(diào)用。
首先在你的程序中調(diào)用接口的實現(xiàn)
DataStore ds? =???? com.piliskys.dataStore.DataManager.getInstance();
首先申明此句并未得到數(shù)據(jù)庫的聯(lián)接,而是當(dāng)操作時才得到數(shù)據(jù)庫聯(lián)接的,而且在同一次會話中,此聯(lián)接是相同的,具體可看ConnectionUtil此類,此類可以對數(shù)務(wù)進行設(shè)置,
在此接口中,沒有定義提高和回滾操作,因為這些操作都可定義在開發(fā)框架中,正常結(jié)束就提交,捕獲異常就回滾,
這兩操作可直接調(diào)ConnectionUtil.currentConnection("piliskys")的操作,
那么我們開始介紹它的各個方法,在此為一個tb_person表為例:
tb_person(per_name varchar2,per_age number), per_name 為主鍵
? 1,? public? boolean delete(Object obj)
? 刪除單個vo,需要設(shè)置主鍵,
程序:刪一個叫 小李 的記錄
DataStore ds? = com.piliskys.dataStore.DataManager.getInstance();//這里是沒有跟數(shù)據(jù)庫
????????? ds.delete(new TbPerson("小李"));//有主鍵的表都有此構(gòu)造方法
??? ConnectionUtil.currentConnection("piliskys").commit;
----------------------------------------------
就這么簡單,以下調(diào)用DataStore 和提交略
? 2,? public? int deleteByVO(Object obj)//返回刪除的記錄數(shù)
注:如果未對obj設(shè)置任何條件將不會進行刪除操作(因為個人認為這一般是不可能的,比較危險,所以加以控制)
程序:刪除姓? 李 的記錄
?TbPerson tp =new TbPerson();
?tp.setPerName("李%");
?ds.deleteByVO(tp);
----------------------------------------------
程序:刪除年齡大于等于 19歲的記錄
? TbPerson tp =new TbPerson();
?tp.setPerAge(new Long(19),">=");//所有雙參數(shù)方法都是為一些條件選擇而用,后面一參數(shù)是用來設(shè)操作符的 > < >= <= !=,這些,方便吧
?ds.deleteByVO(tp);
----------------------------------------------
程序:刪除年齡為空的記錄
? TbPerson tp =new TbPerson();
? tp.setPerAge(null);
? ds.deleteByVO(tp);
----------------------------------------------
? 3? public? int update(Object obj)
? 此操作必須對主鍵進行設(shè)置,否則報錯,設(shè)置其它字段屬于為更新字段,其它字段未設(shè)置也會報錯,說明沒有可更新的字段,
程序 略
? 4? public? int update(Object src,Object tar)//兩對象必須同類(代表同一表)
?? 此操作 以前一對象做為條件進行批量更新后一對象設(shè)置的值,條件如是字符串可設(shè)置帶%,條件對象也可加操作符,使用所有雙參數(shù)設(shè)置都相同,其它可設(shè)置null,對''字符串不處理
程序 略
? 5? public? boolean insert(Object obj)//未進行設(shè)置的字段為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)
返回所有記錄(但此處為考慮程序的效率,設(shè)置了一個最大數(shù),可參看原文件中定義的MAX_SIZE可進行更改,
程序 查出所有tb_person表的記錄
???? List list = ds.selectAll(TbPerson.class);//也簡單吧
-----------------------------------------------
?7?? public? void selectByPK(Object obj)
?根據(jù)主鍵查找記錄 ,這個是無返回值的,返回的就是本身的這個obj,為了省點內(nèi)存,不用多new一個對象,而且實現(xiàn)的話主鍵已經(jīng)設(shè)好,只要設(shè)其它字段,而且個人認為這樣更好用,如果一個表無主鍵,那么查出來的就是數(shù)據(jù)庫的第一條記錄,利用 rownum=1實現(xiàn),而不是查出的第一條,最大程度地提高數(shù)據(jù)庫的效率,
程序? 查出名叫 劉德華的記錄
???? TbPerson tp =new TbPerson("劉德華");
???? ds.selectByPK(tp);
然后 這個tp就是一個與數(shù)據(jù)庫主鍵為劉德華的記錄,可以用它了
-------------------------------------------------
?8? public? List selectByVO(Object obj)
此方法跟上面的deleteByVO的使用基本相同,返回值是vo的一個系列,
有一點不同的是,deleteByVO不設(shè)置任何查詢條件將不會做操作,而此方法不設(shè)置任何條件的話就會查出所有的(個人認為查詢是無危害性的,要查就查吧)
程序 參考 deleteByVO
?9? public? List selectByVO(Object obj, int i, int j)
? 此方法是上一方法的擴充,主要是用于分頁操作,
程序 查姓 劉 的第11條記錄到20條
??????? ds.selectByVO(new TbPerson("劉%"),11,20);//呵呵,感覺這樣有點別扭
本應(yīng)該 TbPerson tp =new TbPerson();
??????????????? tp.setPerName("劉%");
???????? ds.selectByVO(tp,11,20);//效果一樣,
--------------------------------------------------
?10? public? int sqlExcute(String s, List list)
這個是用于直接調(diào) sql語句的操作,主要是執(zhí)行一些更新,刪除操作, list就是按條件順序設(shè)置的參數(shù)集,PreparedStatement的操作
程序 略
? 11? public List selectBySQL(String s, List list)
這個是用于直接調(diào) sql語句的操作,執(zhí)行查詢操作, list就是按條件順序設(shè)置的參數(shù)集,PreparedStatement的操作
return? List 含map的list,key為字段全部小寫
程序 略
?12? public? List selectByQuery(String s, List list)
這個是用于直接調(diào) sql語句的操作,執(zhí)行查詢操作, list就是按條件順序設(shè)置的參數(shù)集,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;
數(shù)據(jù)庫聯(lián)接關(guān)閉
關(guān)于事物提義及回滾請使用ConnectionUtil.currentConnection("piliskys")的操作。
此程序支持在控制臺顯示sql語句,可以在配制文件中設(shè)置是否顯示,具體操作參看包中的說明。
========================================================================
當(dāng)然個人的能力是有限的,如果你認為還應(yīng)該實現(xiàn)什么功能,程序哪方面不如人意,本人只是按照自己的觀點,站在一個編程者的角度考慮問題,不足之處可能很多,希望多提見意和建議,程序只是經(jīng)本人進行測試,可能不是很全面,希望共同完善。
關(guān)于如何部署于程序,包中有說明。
注意事項:不支持復(fù)合主鍵作為其它表的外鍵,下次改進吧。
最后:請尊重他人成果,謝謝您的支持,本人郵箱piliskys@itpub.net希望得到你的意見和建議。
========================================================================
此處下載原程序http://m.tkk7.com/Files/piliskys/jdbcutil.rar