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