iBATIS特性之七大方面詳談
iBATIS特性有哪些呢?正如你所知道的,可以在任何系統(tǒng)中使用iBATIS。像iBATIS這樣一個框架能夠使你的應(yīng)用從架構(gòu)級別上開始受益是什么原因呢?來開始我們的介紹吧。
iBATIS特性1簡單性
iBATIS被廣泛認(rèn)為是當(dāng)今可用的最簡單的持久化框架之一。簡單性的理念根植于iBATIS開發(fā)團(tuán)隊,它在iBATIS的所有開發(fā)目標(biāo)中居于首位。這種簡單性的取得是因為iBATIS直接構(gòu)建于JDBC和SQL之上。iBATIS對于Java開發(fā)者來說非常簡單,因為它除了不用編寫那么多代碼外與JDBC的工作機(jī)制非常相像。幾乎你知道的關(guān)于JDBC的一切都對iBATIS同樣適用。你幾乎可以這樣認(rèn)為,iBATIS就是以XML的形式來描述的JDBC代碼。有人說,iBATIS擁有許多JDBC所沒有的架構(gòu)級的優(yōu)點,這些優(yōu)點我們隨后就將討論。iBATIS對于數(shù)據(jù)庫管理員以及SQL程序員來說也非常容易理解。iBATIS配置文件幾乎人人都能讀懂,只要他有SQL編程的經(jīng)驗。
iBATIS特性2生產(chǎn)效率
任何一個優(yōu)秀的框架,其目的都是使得框架的使用者能夠獲得更高的生產(chǎn)效率。一般情況下,框架負(fù)責(zé)處理公共的任務(wù),減少編寫那些像樣板一樣的重復(fù)代碼,以及解決復(fù)雜的架構(gòu)級的問題。iBATIS在給開發(fā)人員帶來更高的開發(fā)效率方面做得非常成功。在意大利的Java用戶組(Java Users Group)所做的一個案例調(diào)查中(參見www.jugsardegna.org/vqwiki/jsp/Wiki?IBatisCaseStudy),F(xiàn)abrizio Gianneschi發(fā)現(xiàn)iBATIS減少了持久層大約62%的代碼量。所以能減少如此之多的代碼量,究其原因是開發(fā)者再不需要編寫繁瑣的JDBC代碼了。SQL語句仍然是硬編碼的,不過就像你在本章之前所看到的,SQL不是問題——問題在于JDBC API,對于ADO.NET而言也是如此。
iBATIS特性3性能
性能這個話題無疑會引起框架開發(fā)者、框架使用者以及商業(yè)軟件開發(fā)商之間的一場激烈爭論。事實是,從一個較低的級別來看這個問題,無疑所有的框架都會帶來一定的性能損失。一般來說,如果你比較硬編碼的JDBC代碼和iBATIS代碼,做一個1,000,000次的for循環(huán),你會發(fā)現(xiàn)JDBC在性能上的確有一些優(yōu)勢。幸運(yùn)的是,在現(xiàn)代應(yīng)用開發(fā)中,以上這樣的for循環(huán)帶來的性能損失并不重要。真正重要的是,你如何從數(shù)據(jù)庫中獲取數(shù)據(jù),何時獲取,獲取的頻率又是多少。例如,分頁查詢之所以能大大提高應(yīng)用的性能就在于,它不會將可能成千上萬條的記錄從數(shù)據(jù)庫中一次取出。同樣地,使用像懶加載這樣的特性可以避免加載那些在當(dāng)前情況下并不需要的數(shù)據(jù)。另一方面,如果你確定需要加載一份復(fù)雜的對象圖,涉及到來自多個表的大量數(shù)據(jù),如果能僅用一條SQL語句就完成所有對象的加載顯然可以大大提高效率,iBATIS支持使用這樣的SQL語句。iBATIS支持許多性能優(yōu)化措施,我們將在本章之后的章節(jié)中詳細(xì)討論。就目前而言,最重要的是要知道iBATIS總是能通過一種簡單的方式來配置和使用,其性能與JDBC相當(dāng),甚至更好。另一個需要重點考慮的問題就是,并不是所有的JDBC代碼都是編寫良好的。JDBC API非常復(fù)雜,編寫正確的代碼需要非常小心。不幸的是,大量的JDBC代碼都編寫得相當(dāng)糟糕,因此從較低層次上看甚至還沒有iBATIS工作得好。
iBATIS特性4關(guān)注點分離
在典型的JDBC代碼中,在應(yīng)用的各個層中都能找到與數(shù)據(jù)庫相關(guān)(例如獲取連接、遍歷結(jié)果集)的代碼,這并不稀奇。相信大家都見過甚至開發(fā)過這樣糟糕的應(yīng)用——所有的邏輯都在一個JSP頁面中完成,連接數(shù)據(jù)庫、執(zhí)行SQL語句,遍歷結(jié)果集,當(dāng)然還有散落其間的HTML代碼。這樣的代碼簡直是一個噩夢。在第一章中我們已經(jīng)討論了對應(yīng)用分層的重要性。我們已經(jīng)看到了如何從一個較高的角度對應(yīng)用分層,以及持久層內(nèi)部又是如何進(jìn)一步分層的。iBATIS通過幫助管理所有這些持久化相關(guān)的資源來支持分層,這些資源包括數(shù)據(jù)庫連接(database connection)、prepared statement以及結(jié)果集(result set)。iBATIS提供了一組數(shù)據(jù)庫無關(guān)的接口以及API,使得應(yīng)用的其它部分能夠通過使用這組接口和API保持與數(shù)據(jù)庫相關(guān)資源的獨(dú)立性。使用iBATIS,你的代碼總是在直接與嚴(yán)格的對象打交道,再也不用管那些隨意的結(jié)果集了。iBATIS實際上使得你難以違背對應(yīng)用分層這樣的最佳實踐。
iBATIS特性5明確分工
一些數(shù)據(jù)庫管理員是如此熱愛他們的數(shù)據(jù)庫,以至于不愿意讓任何其他人來為數(shù)據(jù)庫編寫SQL。而有一些人又是如此擅長編寫SQL,以至于其他人都想讓他們來做這項工作。無論是什么原因,在你的開發(fā)團(tuán)隊中實現(xiàn)人盡其才總是有利的。如果你的團(tuán)隊中有人尤其擅長于編寫SQL,但是對于Java或C#卻不那么在行,那么就可以讓他們專門編寫SQL。iBATIS使得這種分工成為可能。因為在iBATIS中,SQL語句在很大程度上同應(yīng)用的源代碼是分離的,SQL程序員可以按照SQL原本的方式來編寫它,而不必?fù)?dān)心有關(guān)SQL字符串連接的問題。即使由相同的開發(fā)者來編寫Java代碼和SQL,在數(shù)據(jù)庫性能調(diào)整(performance tune)的過程中也會有一個來自DBA的常見請求,即“顯示出SQL”。用JDBC來完成此事并不容易,因為SQL隱藏得很深,是連接一堆分散的字符串得到的,甚至還可能是在遞歸語句和條件語句中動態(tài)地創(chuàng)建的。如果使用對象關(guān)系映射,情況就更加復(fù)雜了,因為你通常必須運(yùn)行應(yīng)用然后才能log出這些SQL語句,即使你找到了它們,你也根本不能改變它們。iBATIS則提供了充分的自由,使得任何人都可以開發(fā)、觀察并且修改在數(shù)據(jù)庫中執(zhí)行的SQL語句。
iBATIS特性6可移植性
iBATIS是可移植的。由于它相對簡單的設(shè)計,它幾乎可以用任何一種語言在任何一個平臺上實現(xiàn)。書寫本書時,iBATIS支持3種最受歡迎的開發(fā)平臺:Java、Ruby和微軟.NET的C#。
當(dāng)前,配置文件并不完全跨平臺兼容,但是我們正在計劃使它們更加兼容。重要的是,概念和方法都是可移植的。這就使你能夠保證你所有的應(yīng)用在設(shè)計上是一致的。和其他框架相比,iBATIS可以處理更多語言以及更多類型的應(yīng)用,而無需考慮應(yīng)用設(shè)計的不同。如果應(yīng)用的一致性對于你來說很重要的話,使用iBATIS就可以很好地幫你達(dá)到一致性。
iBATIS特性7開源和誠實
開始時我們說本節(jié)有“自吹自擂”之嫌。事實上,iBATIS是免費(fèi)的開源軟件。無論你是否使用它,我們都不會因此而獲得哪怕是一分錢的利益。你已經(jīng)買了本書,所以我們已經(jīng)獲得了我們該得的利益。開源軟件的最大的優(yōu)點之一就是誠實。我們沒有任何理由對你撒謊。因此下面我們將要做的事在商業(yè)軟件文檔中就是非常罕見的:我們將要討論一些你可能不應(yīng)該使用iBATIS的情況,并且提出一些合適的替代方案。
iBATIS特性就向你介紹到這里,希望通過這樣的講解使你更加清楚的認(rèn)識iBATIS。
【編輯推薦】