iBATIS的優(yōu)、缺點(diǎn)及注意事項(xiàng)淺談
iBATIS:最大的優(yōu)點(diǎn)是可以有效的控制SQL發(fā)送的數(shù)目,提高數(shù)據(jù)層的執(zhí)行效率!好象阿里巴巴現(xiàn)在就用的是iBATIS;它需要程序員自己去寫SQL語句,不想hibernate那樣是完全面向?qū)ο蟮?,自?dòng)化的,iBATIS是半自動(dòng)化的,通過表和對(duì)象的映射以及手工書寫的SQL語句,能夠?qū)崿F(xiàn)比hibernate等更高的查詢效率。
1.優(yōu)點(diǎn)
簡單:
易于學(xué)習(xí),易于使用,通過文檔和源代碼,可以比較完全的掌握它的設(shè)計(jì)思路和實(shí)現(xiàn)。
實(shí)用:
提供了數(shù)據(jù)映射功能,提供了對(duì)底層數(shù)據(jù)訪問的封裝(例如ado.net),提供了DAO框架,可以使我們更容易的開發(fā)和配置我們的DAL層。靈活:
通過SQL基本上可以實(shí)現(xiàn)我們不使用數(shù)據(jù)訪問框架可以實(shí)現(xiàn)的所有功能,或許更多。功能完整:
提供了連接管理,緩存支持,線程支持,(分布式)事物管理,通過配置作關(guān)系對(duì)象映射等數(shù)據(jù)訪問層需要解決的問題。提供了DAO支持,并在DAO框架中封裝了ADO.NET,NHibernate和DataMapper。增強(qiáng)系統(tǒng)的可維護(hù)性:
通過提供DAL層,將業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯分離,使系統(tǒng)的設(shè)計(jì)更清晰,更易維護(hù),更易單元測試。SQL和代碼的分離,提高了可維護(hù)性。
2.缺點(diǎn)
滯后性:
還沒有明確對(duì).NET2.0的支持。最新版本在2.0下編譯可以,但有些單元測試不能通過。
不成熟,工程實(shí)踐較少:
iBATISNet在實(shí)際項(xiàng)目中的使用較少。 只是理論上可行.
半ORM,工具支持較少:
需要我們自己寫SQL,并且.NET下還未發(fā)現(xiàn)可以自動(dòng)生成業(yè)務(wù)層類和配置文件的工具,這點(diǎn)和NHibernate不一樣,NHibernate會(huì)為我們的數(shù)據(jù)庫直接產(chǎn)生SQL,并有一些輔助工具。因此使用iBATIS比NHibernate要多做一些工作。
3.可行性
沒有最好的框架,只有最適合的框架。 存在的便是合理的,它存在就說明有它存在的道理。但它未必為我們存在。所以選擇一個(gè)框架最主要的是看它對(duì)你有沒有意義,意義有多大,是不是比其他框架帶給你的好處要多。沒有絕對(duì)的優(yōu)點(diǎn)也沒有絕對(duì)的缺點(diǎn),重要的是看在什么情況下討論。 上面說了部分的iBATIS的優(yōu)點(diǎn)和部分缺點(diǎn)。這些優(yōu)點(diǎn)從理論上證明iBATIS對(duì)任何數(shù)據(jù)持久層都合適,但未必是最好的選擇。下面對(duì)上面的優(yōu)缺點(diǎn)分別從兩方面討論。簡單: 我們都喜歡簡單,簡單意味著學(xué)習(xí)成本低,使用中出錯(cuò)的可能性低。同時(shí),簡單的東西一般來說功能不夠強(qiáng)大。反過來,復(fù)雜的東西學(xué)習(xí)成本高,用起來不方便,并且團(tuán)隊(duì)沒有很強(qiáng)的技術(shù)實(shí)力,一般不要使用。
實(shí)用:
解決了項(xiàng)目中需要解決的問題,這是任何實(shí)際工程中采用的框架和工具都應(yīng)具有的性質(zhì),否則就不要拿到實(shí)際項(xiàng)目中來。靈活: 靈活有兩層意思,一種是簡單易擴(kuò)展,另一種是功能強(qiáng)大提供了很多選項(xiàng)。iBATIS屬于前者,Hibernate屬于后者。兩者各有優(yōu)缺點(diǎn)。功能完整: iBATIS的功能完整也是相對(duì)的,比我們自己開發(fā)的框架應(yīng)該完整,但對(duì)比其他框架肯定也有一些解決不了的問題。增強(qiáng)系統(tǒng)的可維護(hù)性: 利用iBATIS可以做到SQL和代碼分離,可以設(shè)計(jì)出一個(gè)清晰的數(shù)據(jù)訪問層(DAL)。但項(xiàng)目架構(gòu)是否科學(xué)合理,是否以維護(hù),關(guān)鍵不在iBATIS,因?yàn)樗皇且粋€(gè)數(shù)據(jù)層框架。但是我們也不得不清楚,要想發(fā)揮iBATIS的優(yōu)勢,我們需要做一些額外工作,比如最好設(shè)計(jì)DAO接口,需要將業(yè)務(wù)層實(shí)體和對(duì)實(shí)體的訪問放在不同的工程中,同時(shí)需要維護(hù)xml配置文件。滯后性: iBATIS組現(xiàn)在還沒有提到要支持.NET2.0,很多人在.NET2.0下使用iBATIS都出現(xiàn)了問題。所以如果要使用.NET2.0開發(fā),iBATIS不是一個(gè)好選擇,還需要等待。不成熟: 開源的東西很難說成熟,但一般比我們自己寫的框架要成熟。由于我們可以拿到他的源代碼,所以關(guān)鍵在于我們能否駕馭它。半ORM,工具支持少: 這注定了iBATIS不能從本質(zhì)上提升開發(fā)效率,我們需要自己寫SQL,寫實(shí)體類,寫配置文件。但這也是它優(yōu)越的地方,它沒有為我們做的他多,所以我們就有更多的施展空間。而且它非常適合那些并不能完全控制數(shù)據(jù)庫的系統(tǒng)和需要利用數(shù)據(jù)庫本身提供的高級(jí)特性的統(tǒng)計(jì)查詢系統(tǒng)的開發(fā)。
使用iBATIS需要自己寫SQL,由于我們的SQL不可能完全符合SQL標(biāo)準(zhǔn),比起NHibernate產(chǎn)生的SQL來,可移植性差。不過由于我們更改數(shù)據(jù)庫的可能性較小,對(duì)我們來說SQL符合標(biāo)準(zhǔn)以便可以在遷移到不同服務(wù)器時(shí)代價(jià)最小并不是十分必要的。另一方面,NHibernate雖然可以屏蔽很多數(shù)據(jù)庫間的不同,但是卻很難利用某些數(shù)據(jù)庫的高級(jí)特性,比如Oracle的分析統(tǒng)計(jì)函數(shù)。
NHibernate不適合數(shù)據(jù)庫模式不規(guī)范,約束不完整,需要大量復(fù)雜查詢的系統(tǒng),同時(shí)NHibernate的學(xué)習(xí)成本較高,完全掌握NHibernate也較困難,風(fēng)險(xiǎn)較大。 自己寫框架未必比iBATIS的好,穩(wěn)定,強(qiáng)大和可擴(kuò)展。而且自己開發(fā)框架也需要較大的工作量。 如果使用DotNet并且要選一個(gè)數(shù)據(jù)層框架,而系統(tǒng)中有相當(dāng)一部分較復(fù)雜的SQL,或數(shù)據(jù)庫設(shè)計(jì)不合理,臟數(shù)據(jù)多,對(duì)性能和資源要求嚴(yán)格,iBATIS是一個(gè)比較不錯(cuò)的選擇。他的那些缺點(diǎn)并不是致命的,而且也是有一些解決方案的。尤其是,當(dāng)選用了iBATIS的DataAccess作為DAO框架時(shí),我們可以同時(shí)使用NHibernate,ADO.NET和DataMapper(iBATISNet的核心組件),那樣將會(huì)使風(fēng)險(xiǎn)降到最低,并且整個(gè)系統(tǒng)的框架比較合理。
另外,利用iBATIS可以統(tǒng)一編碼風(fēng)格,節(jié)約開發(fā)成本,大家不會(huì)再把精力浪費(fèi)到分頁 連接池 主鍵生成等地方了,可以集中精力進(jìn)行業(yè)務(wù)組件的編寫。
綜上:
很多時(shí)候我們要在是自己開發(fā)框架和選用第三方框架和選用什么樣的框架問題上進(jìn)行綜合考慮??紤]的標(biāo)準(zhǔn)當(dāng)然是項(xiàng)目的當(dāng)前情況和我們希望達(dá)到目的的一個(gè)平衡。
iBATIS只是封裝了數(shù)據(jù)訪問層,替我們做了部分的對(duì)象關(guān)系映射。但我們的代價(jià)是必須要寫xml配置文件,相對(duì)于Hibernate我們還要寫很多SQL。Hibernate通過工具直接從數(shù)據(jù)庫模式生成實(shí)體類和基本的配置文件,而且大部分情況下不需要我們寫SQL,會(huì)較大的提升開發(fā)效率。但這些也有很多的局限性,尤其是對(duì)環(huán)境的要求較高(數(shù)據(jù)庫設(shè)計(jì),對(duì)象設(shè)計(jì),團(tuán)隊(duì)的協(xié)作等)。 個(gè)人感覺iBATIS對(duì)項(xiàng)目比較有意義的地方在于它小巧靈活,可擴(kuò)展,封裝了數(shù)據(jù)訪問層(事務(wù),緩存,異常,日志),并提供了DAO框架支持。
利用iBATIS我們可以做到代碼和SQL的分離,只要SQL能夠解決的問題,iBATIS就能幫我們較容易的解決,同時(shí)也使我們的項(xiàng)目對(duì)某一框架的依賴性變小(因?yàn)閕BATIS是非侵入性的)。這將極大的降低項(xiàng)目風(fēng)險(xiǎn),減少解決復(fù)雜問題的時(shí)間,使項(xiàng)目的維護(hù)變得簡單。
iBATIS對(duì)于應(yīng)用的修改,調(diào)試,擴(kuò)充和維護(hù)將會(huì)變得容易自然。修改時(shí),我們主要修改的是代表模型的實(shí)體對(duì)象,xml配置文件中的SQL,和/或配置文件的ResultMap(很多時(shí)候是不需要的)。同時(shí),SQL和代碼分離,我們不用在代碼的StringBuffer的append方法之間尋找需要修改的SQL。配置文件中的SQL便利了我們的調(diào)試和對(duì)SQL的評(píng)審及以后的SQL重用。
利用一些框架在前期一般會(huì)拖慢開發(fā)效率。因?yàn)槲覀冃枰冻鰧W(xué)習(xí)成本,很多時(shí)候,使用框架需要寫很多配置文件,在使用不熟時(shí)開發(fā)速度較慢;同時(shí)利用框架往往使系統(tǒng)代碼量增大,比如Model1和Model2模型,開發(fā)效率應(yīng)該還是Model1快,四層的架構(gòu)肯定比兩層的代碼量大。 但對(duì)于中后期開發(fā)和維護(hù)將會(huì)極大的提高效率。
利用一些較完全的開發(fā)框架和代碼生成工具,在前期會(huì)較大的提高開發(fā)效率,但在后期常常會(huì)拖慢進(jìn)度,并有可能成為以后維護(hù)的夢魘。比如torque生成實(shí)體類和其對(duì)應(yīng)的SQL,雖大幅提高了效率,但修改負(fù)擔(dān)較大。
比較理想的開發(fā)方式是使用簡單框架結(jié)合簡單的代碼生成工具??蚣芴峁┫到y(tǒng)的基礎(chǔ)服務(wù),并規(guī)范開發(fā)??蚣芤环矫嫣峁┝碎_發(fā)中某一方面的開發(fā)基礎(chǔ)支持,比如數(shù)據(jù)訪問層,事務(wù),日志,公用類,異常等。另一方面,也為開發(fā)定義了模式,定義了系統(tǒng)的基本輪廓。同時(shí),通過簡單的代碼生成工具生成部分低級(jí)的代碼。比如通過工具從數(shù)據(jù)庫模式生成實(shí)體類。這些類生成后我們可以自由修改。
Hibernate是十分強(qiáng)大,比較完善的ORM框架,不過這是它的優(yōu)點(diǎn)也是它的缺點(diǎn)。 J2EE系統(tǒng)是否采用Hibernate3,是一個(gè)需要認(rèn)真評(píng)估的問題。
要想Hibernate工作的好,數(shù)據(jù)庫的設(shè)計(jì)必須好。同時(shí)對(duì)于復(fù)雜的數(shù)據(jù)操作同時(shí)需要使用SQL,Hibernate3對(duì)于直接使用SQL的支持比Hibernate2要自然,這一點(diǎn)是可以接受的。
Hibernate比較復(fù)雜,功能強(qiáng)大而靈活,要用好Hibernate確實(shí)不是很簡單,當(dāng)然Spring框架提供了對(duì)Hibernate的封裝,使Hibernate的使用變得簡單了點(diǎn)。 可以說iBATIS在任何系統(tǒng)里都適用,但未必是最好選擇。不過iBATIS提供的思路是我們應(yīng)該仔細(xì)考慮的。
iBATIS的優(yōu)、缺點(diǎn)及注意事項(xiàng)就談到這里,我們還會(huì)繼續(xù)關(guān)注iBATIS的。
【編輯推薦】