天天看點

iBatis系列一

XML

iBatis可以使用xml來作為參數輸入以及結果傳回;這個功能的優勢在于某些特定的場景;還有可以通過DOM方式來作為參數傳遞;但是這個方式應用的比較少,如果伺服器是xml伺服器可以采用這種方式;

LazeLoad與groupby技術

對于海量資料,如果一次性就加載可能比較麻煩,這裡就需要一些技術來對傳回資訊進行控制,LazyLoad技術大家都比較清楚,隻有需要的時候再從DB中取值;iBatis裡面支援LazyLoad,但是LazyLoad的設定是全局性質的,groupby的實作則實作了針對單個操作層面上的配置;無論是LazyLoad還是groupby的實作方式都是查詢後,将結果緩存,其他深層次查詢的時候還是獲得這個對象,通過存取這個對象的屬性來實作深度查詢(所謂深度查詢是指相對于父查詢的子查詢)。但是有一點,對于lazyloader而言,如果想要加載全部資料效率是比普通查詢是要低很多的(因為需要多次通路資料庫,增加IO);

rowHandler技術

rowHandler技術和C#裡面的DataReader很像了,iBatis裡面的實作機制每當取到一條記錄後都會走RowHandler的handleRow的方法,如果你實作了這個類的方法,就可以對該資料進行操作;rowhandler的一大優勢就是資料操作完之後就釋放,不會占用記憶體,這一點和LazyLoader以及groupby是不一樣的;

鑒别器

鑒别器的作用在于如果一個查詢裡面要麼是圖書類,要麼是新聞類,當然作為父容器可能是"書店類"(圖書類和新聞類字段不一樣),這樣可以通過鑒别器的配置自動将字段比對到對應的類型上面去;如下圖所示:

iBatis系列一
iBatis系列一

存儲過程技術

iBatis支援存儲過程,以及輸入時輸出參數,要考慮到存儲過程的快捷性。盡管存儲過程違背了"一次編譯,到處運作",但是在提供性能方面很多時候擁有者絕對優勢,比如,有的操作需要通過建立多次互動才能實作,但是使用存儲過程一次就搞定了(比如判斷是否重複,重複就更新,不重複就插入);

批量更新

iBatis提供了批量更新,批量更新多半都是伴随着事務一起的,批量的優勢和存儲過程有些類似,操作集中在一次完成;批量更新與一個缺點:無法再insert之後就立即傳回自動生成主鍵,如果主鍵是自動生成的話;還包括其他的值,比如如果兩個操作具有依賴性,後面的操作(sql執行)依賴于前一個操作的傳回值(傳回到應用層),因為批處理是整合完畢後一次性的送出資料庫處理。如果是互相依賴就是用存儲過程來處理吧;

處理并發

處理并發這個專題iBatis并沒有做處理,作為資料層一個共同的問題一般都是使用更新操作外帶全家桶(時間戳、版本)的方式來進行處理;

外部參數(external-parameter) vs 内聯參數(inline-parameter)

外部參數:

iBatis系列一
iBatis系列一

内聯參數:就是SQL文中通過#...#或者$...$的方式占位的形式

經過測試外部參數隻能是通過有序的"?"來進行,無法在使用聲明名稱的方式(内聯形式),根據iBatis的本意是在insert等操作中内聯參數還需要指定類型,通過定義外聯方式可以一次性制定好類型,友善重用,但是問題是重用的先決條件是SQL參數次序要保持一緻,其次呢,實際應用中,即使不指定類型也是可以順利插入/更新;是以外部參數被使用的不多。