iBATIS映射文件基礎(chǔ)淺談
要了解iBATIS映射文件基礎(chǔ),首先我們來(lái)看,iBATIS的核心就在于映射文件(Data Map XML File)。在映射文件里可以定義包括要執(zhí)行各種SQL語(yǔ)句,存儲(chǔ)過(guò)程,輸入?yún)?shù)映射,返回結(jié)果映射,緩存機(jī)制,并且能通過(guò)幾種相對(duì)比較復(fù)雜的配置實(shí)現(xiàn)對(duì)象之間的關(guān)聯(lián)關(guān)系和延遲加載。這也是iBATIS區(qū)別ORM框架的,具備更靈活性,更高性能的關(guān)鍵所在。
配置文件可以寫(xiě)得很簡(jiǎn)單,也可以很復(fù)雜。復(fù)雜配置文件也是出于更好的設(shè)計(jì),更好性能,更好擴(kuò)展性方面的目的。再?gòu)?fù)雜的配置文件也是有限的,一個(gè)映射文件包括:Mapped Statements、Parameter Maps、Result Maps、Cache Models幾個(gè)主要的配置,還包括命名空間的配置,類(lèi)型別名的配置。
iBATIS映射文件1.Mapped Statements :
顧名思義就是映射的語(yǔ)句聲明。它是整個(gè)iBATIS配置核心的核心,真正將被執(zhí)行的SQL語(yǔ)句(或存儲(chǔ)過(guò)程)都是必須在這里被顯式聲明。在Mapped Statements里可以包含有:statement、select、insert、update、delete、procedure這6種不同的語(yǔ)句類(lèi)型。從詞面理解相信就可以了解到這些類(lèi)型功能的一大半了。statement可以包含所有類(lèi)型的SQL語(yǔ)句(存儲(chǔ)過(guò)程),它是一個(gè)泛泛的語(yǔ)句配置,沒(méi)特別明確的職責(zé),相反,其它5種類(lèi)型的語(yǔ)句配置就是專(zhuān)門(mén)負(fù)責(zé)各種不同的SQL語(yǔ)句。下面這張圖列出了各種類(lèi)型的語(yǔ)句的不同職責(zé)和調(diào)用方法。
Mapped Statements語(yǔ)句調(diào)用圖
iBATIS映射文件2.Parameter Maps :
參數(shù)映射的配置,它是被用來(lái)向一個(gè)語(yǔ)句(statement)提供所需參數(shù)的配置。每一個(gè)Parameter Maps都有一個(gè)自己的ID,在需要的時(shí)候需要在statement 的 parameterMap屬性中提供它的ID。但是對(duì)一個(gè)語(yǔ)句來(lái)說(shuō),它并不是必須,在iBATIS中還支持內(nèi)聯(lián)參數(shù)(Inline Parameter Maps)的形式,我們不需單獨(dú)寫(xiě)一個(gè)Parameter Maps配置,只需要向parameterClass提供參數(shù)的類(lèi)型,可以是元數(shù)據(jù)類(lèi)型,復(fù)合數(shù)據(jù)類(lèi)型,IDictionary數(shù)型的弱類(lèi)型對(duì)象(使用key,value的鍵值對(duì))。在內(nèi)部訪問(wèn)數(shù)據(jù)類(lèi)型的時(shí)候只使用#property#的形式訪問(wèn)對(duì)應(yīng)的屬性值。
注意:在任何地方使用到的parameterClass類(lèi)型如果是一個(gè)元數(shù)據(jù)類(lèi)型(int,string etc),都需要使用#value#的形式的來(lái)訪問(wèn)它的值。
iBATIS映射文件3.Result Maps :
返回結(jié)果的映射關(guān)系配置,就是列與屬性的對(duì)應(yīng)關(guān)系。在statement中使用resultMap屬性來(lái)指定一個(gè)結(jié)果映射。對(duì)一個(gè)statement來(lái)說(shuō),resultMap也不是必須的,同樣的,它仍然可以被resultClass給代替,因?yàn)槿绻祷爻鼋Y(jié)果數(shù)據(jù)集的列名跟數(shù)據(jù)對(duì)象的屬性相同的話,它會(huì)自動(dòng)去匹配,但是它不保證所有列都被會(huì)被正確映射(當(dāng)某列名在對(duì)象中找不對(duì)應(yīng)的屬性名,這列值將不被處理)。而resultMap則不同,如果已經(jīng)在resultMap中定義將要使用到列或?qū)傩栽诮Y(jié)果集或數(shù)據(jù)對(duì)象中不存在,將會(huì)被認(rèn)為是錯(cuò)誤的,將會(huì)拋出異常。通過(guò)上面的表可以看到insert,update,delete三種語(yǔ)句類(lèi)型是沒(méi)有resultMap和resultClass,因?yàn)樵瓌t上來(lái)說(shuō),它們的操作是沒(méi)有必要返回結(jié)果集。
注意:如果在一個(gè)statement中同時(shí)指定了resultMap和resultClass屬性的話,那將會(huì)優(yōu)先使用resultMap。同時(shí)result Map也是一個(gè)實(shí)現(xiàn)對(duì)象復(fù)雜查詢(xún)功能的重要手段,如:result map的繼承(與discriminator配合使用),對(duì)象的1..1、1..N關(guān)系查詢(xún)。
iBATIS映射文件4.Cache Model :
緩存模型。使用在Cache Model中定義好的緩存機(jī)制,只需在查詢(xún)語(yǔ)句配置的cacheModel屬性就可以很容易地緩存查詢(xún)返回的數(shù)據(jù)集。在iBATIS中提供了三種的類(lèi)型的緩存模式(Memory,LRU,FIFO)算法。三種算法主要在于靜態(tài)過(guò)期策略上的不同,而它們都有相同的動(dòng)態(tài)過(guò)期依賴(lài)策略,即可以設(shè)置執(zhí)行哪些statement時(shí),緩存過(guò)期。
注意:iBATIS的緩存模型正常情況是非常好用的,但是因?yàn)榫彺孢^(guò)期策略上的封裝性,它在多個(gè)服務(wù)器,負(fù)載平衡場(chǎng)景下還是有它的局限性。
iBATIS映射文件基礎(chǔ)就介紹到這里,希望通過(guò)這樣的介紹,使你能夠更好的了解到iBATIS映射文件的情況。
【編輯推薦】