- 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í)。
- Vue.js框架與Web前端開(kāi)發(fā)從入門到精通
- Premiere Pro 2022從新手到高手
- Photoshop CC 實(shí)戰(zhàn)入門
- 影視動(dòng)畫場(chǎng)景與特效制作:3ds Max-Vue-AfterBurn-FumeFX
- Drools JBoss Rules 5.0 Developer's Guide
- SketchUp/Piranesi印象彩繪表現(xiàn)項(xiàng)目實(shí)踐
- AI繪畫+LoRA模型訓(xùn)練從新手到高手
- Photoshop CC入門與提高
- 零基礎(chǔ)學(xué)Premiere Pro短視頻制作
- Flash CS5動(dòng)畫設(shè)計(jì)教程
- 中文版Flash CC動(dòng)畫制作實(shí)用教程
- Oracle Modernization Solutions
- 從CAD到CAE設(shè)計(jì)方法
- AutoCAD計(jì)算機(jī)輔助設(shè)計(jì)標(biāo)準(zhǔn)教程(慕課版)
- 零基礎(chǔ)學(xué)Adobe XD產(chǎn)品設(shè)計(jì)