hibernate?ejb?以及最近了解到的ibatis?
ejb歷來(lái)以繁瑣著稱(chēng),或者稱(chēng)為重量級(jí)。
hibernate,看看它的hello cat演示很簡(jiǎn)單,但實(shí)際使用中幾乎沒(méi)有那么簡(jiǎn)單的情況。一旦業(yè)務(wù)復(fù)雜的話(huà),再考慮上性能等等要求,總覺(jué)得也過(guò)于重量級(jí)。最不爽的是一種情況是如果關(guān)系表(就是僅僅包含2個(gè)主業(yè)務(wù)表的數(shù)據(jù)關(guān)聯(lián),可能只有2,3個(gè)字段的那種)多一點(diǎn),一對(duì)多,多對(duì)多,用起來(lái)總感覺(jué)象殺雞用牛刀:明明就是幾個(gè)關(guān)聯(lián)簡(jiǎn)單處理一下即可,但卻非要換成對(duì)象。還要lazy load。呵呵,抱怨一下。我用hibernate,操作上感覺(jué)比較舒服的是create和update的時(shí)候。最痛苦的是query,次不爽的是delete。
ibatis,我只是看了一下所謂的demo,就跑了。配置文件復(fù)雜的來(lái)。。。且把sql寫(xiě)在配置中,個(gè)人總是很難接受這種方式,如果是team work的話(huà),不夠安全的說(shuō),總覺(jué)得貌似是個(gè)人都能改(最怕N個(gè)人在同一個(gè)xml中配自己的SQL,林子大了什么鳥(niǎo)都有,team人多了,什么問(wèn)題都會(huì)出;這種多人搞一個(gè)文件就是問(wèn)題的最佳孳生點(diǎn))。
羅索了這么多,下面說(shuō)重點(diǎn),開(kāi)始總結(jié)。
我覺(jué)得目前大部分都基于關(guān)系數(shù)據(jù)庫(kù)的現(xiàn)狀,增刪改查四大功能中,【查】,【增】可充分考慮OO思想,【改】可以適用部分OO思想,【刪】則幾乎不用考慮OO。我所指的OO,是以對(duì)象的概念來(lái)操作的意思。
【查】,我覺(jué)得可以做到調(diào)用者自己根據(jù)業(yè)務(wù)組織SQL語(yǔ)句,定義SQL結(jié)果數(shù)據(jù)存儲(chǔ)POJO類(lèi),然后調(diào)用query方法,完成查詢(xún),并將結(jié)果集數(shù)據(jù)載入到POJO對(duì)象中。這個(gè)樣子即滿(mǎn)足了大部分的需求。分頁(yè)暫不予考慮。
public List doQuery(String sqlClause, Class pojoClass) throws XException;
關(guān)于這個(gè),我已經(jīng)有一篇隨筆,且自己已經(jīng)代碼實(shí)現(xiàn)并驗(yàn)證。所以不多說(shuō)了。
【增】,向指定的表插數(shù)據(jù)是比較容易讓人聯(lián)想到對(duì)象概念的操作。所以,應(yīng)該比較適合使用對(duì)象。增操作時(shí),指定表名,指定POJO對(duì)象實(shí)例,調(diào)用insert方法。
public void doInsert(String tableName, Object pojoInstance) throws XException;
所作的事情:
1。從數(shù)據(jù)庫(kù)載入表結(jié)構(gòu)(一般來(lái)說(shuō)表結(jié)構(gòu)改動(dòng)的可能性不大,一次掃描后可緩存)
2。將POJO對(duì)象的get屬性和表的字段,類(lèi)型關(guān)聯(lián)起來(lái)
3。構(gòu)造insert語(yǔ)句。最好再檢查一下字段能否為null等等。
4。執(zhí)行insert語(yǔ)句。
實(shí)際上,我覺(jué)得還有一種方式雖然對(duì)象概念不多,但應(yīng)該也蠻靈活,好用的。
public void doInsert(String tableName, Map values) throws XException;
基本操作思想和上面的一致。不過(guò)不需要用反射獲取屬性信息了。直接從map中遍歷即可。
【改】,更新的字段多時(shí),可能組織為一個(gè)POJO對(duì)象比較讓人能接受;但如果每次只更新1,2個(gè)字段或者針對(duì)某個(gè)表更新業(yè)務(wù)比較多(這次是a,b字段,下次是c,d等字段)的話(huà),貌似丟棄對(duì)象,直接MAP更方便丫。基本接口和insert類(lèi)似。個(gè)人感覺(jué)這是一個(gè)比較中間化的操作。
【刪】,一般我們刪除時(shí)都是根據(jù)主鍵或者某些字段的條件來(lái)的。簡(jiǎn)單根據(jù)主鍵來(lái)刪時(shí),貌似用MAP也比較能接受,因?yàn)橥ㄟ^(guò)指定倆參數(shù),自己可以不用組織SQL,輕微爽的說(shuō)。復(fù)雜點(diǎn)的刪,業(yè)務(wù)要求組織一個(gè)暴惡心的SQL的情況也未嘗不存在,這種情況下,我們最多提供一個(gè)直接執(zhí)行SQL語(yǔ)句的接口即可。
以上純屬個(gè)人想法,不甚成熟,隨筆記之,以做備忘。