官术网_书友最值得收藏!

  • iBATIS框架源碼剖析
  • 任鋼
  • 1450字
  • 2018-12-30 14:35:58

1.1 iBATIS概論

iBATIS Database Layer架構(gòu)自2001年發(fā)展以來(lái),至今已經(jīng)成為Apache的官方項(xiàng)目。在iBATIS創(chuàng)始人的《iBATIS實(shí)戰(zhàn)》一書中已經(jīng)對(duì)iBATIS的定位做了一個(gè)明確的說(shuō)明。iBATIS是一種Data Mapper,那什么又是Data Mapper呢?Martin Fowler在他的《Patterns of Enterprise Application Architecture》一書中是這樣描述Data Mapper的:一個(gè)映射層,在對(duì)象和數(shù)據(jù)庫(kù)間傳遞數(shù)據(jù),并保持兩者與映射層本身相獨(dú)立。所以說(shuō),Mapper是在兩個(gè)獨(dú)立對(duì)象間建立通信關(guān)系的一種對(duì)象。

通過(guò)對(duì)程序源碼的分析,iBATIS也具備了ORM框架的一些基本特性,但實(shí)際上iBATIS更像是一個(gè)SQL工具。同時(shí),iBATIS不是直接在類與數(shù)據(jù)表或字段與列之間進(jìn)行關(guān)聯(lián),而是把SQL語(yǔ)句的參數(shù)(parameter)和返回結(jié)果(result)映射至實(shí)體類(或JavaBean)。iBATIS是處于實(shí)體類和數(shù)據(jù)表之間的一個(gè)中間層,這使得它在類和數(shù)據(jù)表之間進(jìn)行映射時(shí)更加靈活,而不需要數(shù)據(jù)庫(kù)模型或?qū)ο竽P停∣bject Model)的任何修改。我們所說(shuō)的中間層實(shí)際上就是SQL映射層,它使得iBATIS能夠更好地分離數(shù)據(jù)庫(kù)和對(duì)象模型的設(shè)計(jì),這樣就相對(duì)減少了兩者間的耦合。

相對(duì)Hibernate和Apache OJB等“一站式”O(jiān)RM對(duì)象關(guān)系映射解決方案而言,iBATIS是一種“半自動(dòng)化”的ORM實(shí)現(xiàn)。這里要說(shuō)明一下“全自動(dòng)化”和“半自動(dòng)化”在實(shí)現(xiàn)ORM模式上的區(qū)別。

Hibernate和Apache OJB都是對(duì)數(shù)據(jù)庫(kù)結(jié)構(gòu)提供了較為完整的封裝.提供了從POJO(Plain Old Java Objects普通Java對(duì)象)到數(shù)據(jù)庫(kù)表的全套映射機(jī)制。軟件開(kāi)發(fā)人員往往只需定義好了POJO到數(shù)據(jù)庫(kù)表的映射關(guān)系,即可通過(guò)Hibernate或者OJB提供的方法完成持久層操作,軟件開(kāi)發(fā)人員甚至不需要對(duì)SQL的熟練掌握。Hibernate、Apache OJB會(huì)根據(jù)制定的存儲(chǔ)邏輯,自動(dòng)生成對(duì)應(yīng)的SQL并調(diào)用JDBC接口去執(zhí)行。我們把這種模式稱為“全自動(dòng)化”模式。

“半自動(dòng)化”O(jiān)RM框架是相對(duì)上述提到的Hibernate等提供了全面的數(shù)據(jù)庫(kù)封裝機(jī)制的“全自動(dòng)化”O(jiān)RM實(shí)現(xiàn)而言,“半自動(dòng)化”O(jiān)RM框架重點(diǎn)在于POJO與SQL之間的映射關(guān)系。也就是開(kāi)發(fā)人員編寫SQL語(yǔ)句,通過(guò)映射配置文件,將SOL所需的參數(shù),以及返回的結(jié)果字段映射到指定的POJO。這些過(guò)程全是手工來(lái)進(jìn)行操作。iBATIS就屬于“半自動(dòng)化”O(jiān)RM。

“全自動(dòng)”O(jiān)RM機(jī)制在大多數(shù)情況下有很大的優(yōu)勢(shì)。但是,也有一些特定的環(huán)境,這種一站式的解決方案卻未必是最佳的選擇。在現(xiàn)實(shí)中,這些特定的環(huán)境條件具有如下的特點(diǎn):

① 數(shù)據(jù)庫(kù)系統(tǒng)對(duì)于開(kāi)發(fā)人員并不是完全控制的。處于安全考慮,也許只有部分?jǐn)?shù)據(jù)或者局部權(quán)限開(kāi)放給開(kāi)發(fā)人員。只對(duì)開(kāi)發(fā)團(tuán)隊(duì)提供幾條Select SQL或存儲(chǔ)過(guò)程以獲取所需數(shù)據(jù),具體的表結(jié)構(gòu)不予公開(kāi)。

② 為了提高系統(tǒng)的性能和實(shí)現(xiàn)分層開(kāi)發(fā),必須由數(shù)據(jù)庫(kù)層的存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)所有的業(yè)務(wù)邏輯部分。

③ 對(duì)于一些系統(tǒng),由于表與表之間主鍵和外鍵的約束關(guān)系復(fù)雜,這造成了生成標(biāo)準(zhǔn)POJO對(duì)象之間的關(guān)系也比較復(fù)雜,但是可以通過(guò)多種復(fù)合SQL可以編寫出比較簡(jiǎn)潔高效的語(yǔ)句來(lái)實(shí)現(xiàn)多表關(guān)聯(lián)查詢。

④ 由于系統(tǒng)數(shù)據(jù)處理量巨大,對(duì)性能要求極為苛刻,這往往意味著我們必須通過(guò)經(jīng)過(guò)高度優(yōu)化的SQL語(yǔ)句或存儲(chǔ)過(guò)程才能達(dá)到系統(tǒng)性能設(shè)計(jì)指標(biāo)。

面對(duì)這樣的需求。如果再使用Hibernate這種數(shù)據(jù)訪問(wèn)策略來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)就顯得很不明智了。此時(shí)“半自動(dòng)化”的iBATIS,卻剛好解決了這個(gè)問(wèn)題。

當(dāng)然,iBATIS的ORM模式也并不是沒(méi)有缺陷。首先,對(duì)于開(kāi)發(fā)人員是增加工作量。iBATIS并不會(huì)為開(kāi)發(fā)人員在運(yùn)行期自動(dòng)生成SQL語(yǔ)句執(zhí)行,具體的SQL語(yǔ)句需要開(kāi)發(fā)人員編寫。其次,對(duì)開(kāi)發(fā)人員的要求要高一點(diǎn),畢竟要求開(kāi)發(fā)人員對(duì)SQL語(yǔ)句要有一定的要求。最后,iBATIS支持的SQL是標(biāo)準(zhǔn)規(guī)范的SQL,可以在所有支持標(biāo)準(zhǔn)SQL的數(shù)據(jù)庫(kù)系統(tǒng)中移植和運(yùn)行。但是針對(duì)一些對(duì)標(biāo)準(zhǔn)SQL有擴(kuò)展的SQL,如T-SQL、PL SQL等,則缺乏對(duì)擴(kuò)展部分的支持。

在iBATIS創(chuàng)始人的《iBATIS實(shí)戰(zhàn)》一書中,也專門提到了iBATIS的不適合環(huán)境。其中iBATIS不適合的三種環(huán)境為:① 當(dāng)對(duì)數(shù)據(jù)庫(kù)永遠(yuǎn)擁有完全控制權(quán);② 當(dāng)應(yīng)用程序需要完全動(dòng)態(tài)的SQL語(yǔ)句;③ 當(dāng)數(shù)據(jù)是非關(guān)系數(shù)據(jù)庫(kù)時(shí)。

主站蜘蛛池模板: 桂东县| 靖宇县| 林甸县| 华阴市| 胶南市| 河源市| 富宁县| 青河县| 拜泉县| 尚志市| 将乐县| 东山县| 闵行区| 喀喇沁旗| 黄浦区| 屏东县| 囊谦县| 周口市| 东阿县| 莱阳市| 榆树市| 尼玛县| 浦江县| 永靖县| 通城县| 顺义区| 高州市| 天祝| 开封市| 福安市| 凌云县| 抚顺市| 保靖县| 吴旗县| 玉环县| 横峰县| 雅安市| 清原| 奉新县| 大渡口区| 玛沁县|