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