什么是iBATIS
什么是iBATIS呢?讓我們首先來(lái)看看它的概念:iBATIS就是我們通常所說(shuō)的數(shù)據(jù)映射器(data mapper)。Martin Fowler在他的著作Patterns of Enterprise Application Architecture(Addison-Wesley Professional, 2002)中,對(duì)數(shù)據(jù)映射器模式是這樣描述的:
所謂映射器,是用于在對(duì)象和數(shù)據(jù)庫(kù)之間搬運(yùn)數(shù)據(jù),同時(shí)保證對(duì)象、數(shù)據(jù)庫(kù)以及映射器本身都相互獨(dú)立。
Martin在區(qū)分?jǐn)?shù)據(jù)映射以及元數(shù)據(jù)映射上,確實(shí)做了一件非常出色的工作,元數(shù)據(jù)映射正是適合使用對(duì)象/關(guān)系映射(O/RM)工具的地方。O/RM工具將數(shù)據(jù)庫(kù)表及其列映射為應(yīng)用中的類及字段?;蛘哒f(shuō),O/RM工具在數(shù)據(jù)庫(kù)的元數(shù)據(jù)與類的元數(shù)據(jù)之間建立起了一種映射關(guān)系。圖2-1展示了所謂的O/RM,它在一個(gè)類與數(shù)據(jù)庫(kù)表之間建立了映射關(guān)系。在這種情況下,類的每一個(gè)字段都被映射為數(shù)據(jù)庫(kù)中相應(yīng)表的唯一列。
圖2-1 對(duì)象/關(guān)系映射
iBATIS與之不同,它不是直接把類映射為數(shù)據(jù)庫(kù)表或者說(shuō)把類的字段映射為數(shù)據(jù)庫(kù)列,而是把SQL語(yǔ)句的參數(shù)與結(jié)果(也即輸入和輸出)映射為類。正如你在本書(shū)的剩余部分中將會(huì)學(xué)到的,iBATIS在類和數(shù)據(jù)庫(kù)表之間建立了一個(gè)額外的間接層,這就為如何在類和數(shù)據(jù)庫(kù)表之間建立映射關(guān)系帶來(lái)了更大的靈活性,使得在不用改變數(shù)據(jù)模型或者對(duì)象模型的情況下改變它們的映射關(guān)系成為可能。其實(shí)我們這里討論的這個(gè)間接層就是SQL。SQL這個(gè)額外的間接層使得iBATIS能夠更好地隔離數(shù)據(jù)庫(kù)設(shè)計(jì)和應(yīng)用中使用的對(duì)象模型。這就使得它們兩者之間的相關(guān)性能夠降至最少。圖2-2展示了iBATIS如何使用SQL映射數(shù)據(jù)。
圖2-2 iBATIS的SQL映射
正如你在圖2-2中所看到的,iBATIS的映射層其實(shí)就是SQL。iBATIS讓你自己寫(xiě)SQL語(yǔ)句,iBATIS負(fù)責(zé)在類的字段和數(shù)據(jù)庫(kù)表的列之間映射參數(shù)和結(jié)果?;谶@個(gè)原因,也考慮到與其他各種各樣的映射方式的區(qū)分,為避免混淆,iBATIS小組通常將所謂的“數(shù)據(jù)映射器”稱為SQL映射器(SQL mapper)。
什么是iBATIS之映射SQL語(yǔ)句
任何一條SQL語(yǔ)句都可以看作是一個(gè)函數(shù),有輸入輸出集合。輸入即參數(shù)(parameter),通??梢栽赟QL語(yǔ)句的WHERE子句中找到。輸出則是SELECT子句中指定的那些列。圖2-3描述了這個(gè)思想。
圖2-3 SQL語(yǔ)句可以被看作一個(gè)包含輸入輸出的函數(shù)
這種方式的最大優(yōu)點(diǎn)就在于SQL語(yǔ)句使得開(kāi)發(fā)者能夠自己把握巨大的靈活性。他可以在不改變數(shù)據(jù)模型的前提下輕易地操縱數(shù)據(jù)以適應(yīng)對(duì)象模型。甚至,開(kāi)發(fā)者還可以通過(guò)數(shù)據(jù)庫(kù)內(nèi)建的函數(shù)和存儲(chǔ)過(guò)程引入多表和結(jié)果集??傊?,他們可以隨心所欲地利用SQL的強(qiáng)大能力。
iBATIS使用一個(gè)簡(jiǎn)單的XML描述文件來(lái)映射SQL語(yǔ)句的輸入和輸出。代碼清單2-1給出了一個(gè)這樣的例子。
代碼清單2-1 一個(gè)SQL映射的例子
從以上代碼中我們看到了一條SELECT語(yǔ)句,它返回address表中的數(shù)據(jù)。從<select>元素的parameterClass屬性中我們可以看出該語(yǔ)句使用一個(gè)Integer對(duì)象作為參數(shù),該參數(shù)是通過(guò)WHERE子句中的#id#符號(hào)標(biāo)記的;從<select>元素的resultClass屬性我們還可以看出該語(yǔ)句的結(jié)果是一個(gè)Address類的實(shí)例,假設(shè)Address類的所有字段名與SELECT語(yǔ)句中指定的各個(gè)列的別名(通過(guò)as關(guān)鍵字)相同。例如,ADR_ID列別名為id,故會(huì)映射到Address類中名為id的字段上。不論你是否相信,要映射一個(gè)SQL語(yǔ)句使其接受一個(gè)Integer作為參數(shù)并返回一個(gè)Address對(duì)象作為結(jié)果,你要做的就是這些了。用于執(zhí)行以上語(yǔ)句的Java代碼如下:
- Address address = (Address) sqlMap.queryForObject("getAddress", new Integer(5));
SQL映射這個(gè)概念具有很好的可移植性,可應(yīng)用于任何一個(gè)功能完備的編程語(yǔ)言。例如,基于iBATIS.NET的C#代碼就與之前的Java代碼幾乎是一模一樣的:
- Address address = (Address) sqlMap.QueryForObject("getAddress", 5);
當(dāng)然,iBATIS針對(duì)SQL映射還有許多高級(jí)選項(xiàng),特別是針對(duì)映射的返回結(jié)果。關(guān)于這些高級(jí)選項(xiàng),我們會(huì)在本書(shū)的第二部分“iBATIS基礎(chǔ)”中詳細(xì)討論?,F(xiàn)在,我們最重要的任務(wù)就是了解iBATIS的特性和好處,以及它如何工作。
什么是iBATIS就向你介紹到這里,希望通過(guò)介紹是你能對(duì)什么是iBATIS有所了解。
【編輯推薦】