ibatis高級特性_第1頁
ibatis高級特性_第2頁
ibatis高級特性_第3頁
ibatis高級特性_第4頁
ibatis高級特性_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、iBATIS高級特性1、主要內(nèi)容l 關(guān)聯(lián)對象l 事務(wù)l 延遲加載l 緩存l 動(dòng)態(tài)標(biāo)簽l 讀寫CLOB和BLOB字段l 與spring的整合2、關(guān)聯(lián)對象 我們的大部分員工習(xí)慣了Hibernate的關(guān)聯(lián)對象查詢、級聯(lián)刪除、級聯(lián)保存等特性,那么iBATIS是否提供同樣的功能呢?這是大部分人會(huì)關(guān)心的內(nèi)容。 答案也許是另人失望的。iBATIS可以關(guān)聯(lián)查詢,卻沒有提供級聯(lián)保存和級聯(lián)刪除的特性。 下面我們介紹如何處理關(guān)聯(lián)對象之間的查詢、保存及刪除問題。 2.1 關(guān)聯(lián)查詢iBatis為我們提供了兩種方式關(guān)聯(lián)查詢,第一種N+1次查詢,第二種新支持的查詢方式。兩種方式需要根據(jù)具體的應(yīng)用環(huán)境,作出合適的選擇。前一種

2、由于多了一次和數(shù)據(jù)庫的讀取操作,所以讀取速度慢了些,但是可以使用延遲加載減少內(nèi)存的消耗。而后一種方式多了些內(nèi)存消耗,但是讀取速度要快了。定義一個(gè)需求:我們在查詢訂單的同時(shí)希望查詢出其關(guān)聯(lián)的訂單項(xiàng)。2.2.1 采用N+1次查詢首先看看我們的SQL Mapped配置文件如何配置的:我們可以看到,RESULT的select屬性指向一個(gè)新的查詢語句。說明:這個(gè)很好的解決了關(guān)聯(lián)查詢的問題,而且如果我們配置了全局的延遲加載,當(dāng)真正用到訂單項(xiàng)的時(shí)候,iBatis才為我們做查詢的動(dòng)作。但是這卻帶來了另外一個(gè)問題,N+1次查詢的問題。也就是多了一次數(shù)據(jù)庫的讀操作,有一定的性能損失。2.2.2 新查詢方式首先看看

3、我們的SQL Mapped配置文件如何配置的:我們可以看到,RESULT的resultMap屬性指向一個(gè)resultMap標(biāo)簽定義。說明:與前面N+1次查詢方式比較,由于只讀取數(shù)據(jù)庫一次,的確讀取速度更快了,但是由于存在更多的內(nèi)存消耗(N+1方式可以通過延遲加載來減少內(nèi)存的消耗),所以我們該根據(jù)具體的應(yīng)用情況而選擇合適的方式。2.2 級聯(lián)保存在Hibernate中,我們可以使用級聯(lián)保存,而iBATIS并沒有提供該功能特性,此時(shí)我們需要自己保存關(guān)聯(lián)的對象數(shù)據(jù)。定義一個(gè)需求:在保存訂單的時(shí)候,希望一起保存其關(guān)聯(lián)的訂單項(xiàng)。其DAO層可以定義如下兩個(gè)方法分別保存訂單和關(guān)聯(lián)的訂單項(xiàng):BMO層可以作如下調(diào)

4、用:這里涉及到的事務(wù)等后面講解事務(wù)的時(shí)候再說明如何實(shí)現(xiàn)。2.3 級聯(lián)刪除 同樣iBatis未提供級連刪除的特性,我們要?jiǎng)h除連關(guān)聯(lián)表一起刪除,也需要自己實(shí)現(xiàn),其方式和保存類似,第一次刪除關(guān)聯(lián)的子表如訂單項(xiàng),再刪除其主表如訂單。 3、事務(wù)3.1自動(dòng)事務(wù)所謂自己事務(wù),就是說Ibatis API單個(gè)方法自動(dòng)劃分為一個(gè)事務(wù),不需要顯示的開始、提交、結(jié)束。3.2局部事務(wù)其主要針對一種應(yīng)用程序、一個(gè)資源、且一次只能處理一個(gè)事務(wù)。如圖:其配置如下:實(shí)現(xiàn)方式:說明:在Spring已經(jīng)使用AOP申明式事務(wù),所以像上面的配置文件及編碼式事務(wù)使用到的可能性不大。在藍(lán)本工程的bss-BluePrint-spr

5、ing-db.xml其Spring配置如下:只要SMOImpl匹配的類,其insert*、update*、add*、del*將自動(dòng)使用事務(wù)。3.3全局事務(wù)全局事務(wù)定義了一個(gè)更大的事務(wù)范圍,它可以夸數(shù)據(jù)庫、消息隊(duì)列、甚至包含其它應(yīng)用程序。下圖展示了一個(gè)全局的事務(wù)系統(tǒng):下圖展示一個(gè)全局事務(wù)的配置方式:接口和iBATIS的局部事務(wù)相同。這樣當(dāng)需要從局部事務(wù)切換到全局事務(wù)的時(shí)候會(huì)很方方便,只要更改配置文件,不需要更改接口代碼了。4、延遲加載配置方式如下圖:該屬性默認(rèn)值為true,若該屬性值為true,當(dāng)采用N+1次查詢的時(shí)候,iBatis會(huì)在需要關(guān)聯(lián)數(shù)據(jù)的時(shí)候才開始執(zhí)行查詢。5、緩存6、動(dòng)態(tài)標(biāo)簽主要分

6、為五類動(dòng)態(tài)標(biāo)簽:6.1 dynamic標(biāo)簽Dynamic可以使用的屬性如下:屬性功能Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時(shí)候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,close值將不起作用。使用示例如下:6

7、.2 二元標(biāo)簽二元標(biāo)簽的屬性如下:屬性功能Property(必選)參數(shù)對象用于同compareProperty或compareValye作比較的特性Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時(shí)候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽

8、的結(jié)果內(nèi)容體為空的時(shí)候,close值將不起作用。romoveFirstPrepend(可選)該值用于決定第一個(gè)嵌套的內(nèi)容生成標(biāo)簽是否有移除其prepend值compareProperty、compareValye(兩個(gè)必有其一)用來同property特性值作比較二元?jiǎng)討B(tài)標(biāo)簽如下:<isEqual>Property屬性與compareProperty或pareValye屬性值作比較,看是否相同<isNotEqual>Property屬性與compareProperty或pareValye屬性值作比較,看是否不同<isGreaterThan>Property屬性

9、是否大于pareProperty或pareValye屬性值<isGreaterEqual>Property屬性與compareProperty或pareValye屬性值作比較,看是否相同<isLessThan>Property屬性與compareProperty或pareValye屬性值作比較,看是否相同<isLessEqual>Property屬性與compareProperty或pareValye屬性值作比較,看是否相同使用示例如下:6.3 一元標(biāo)簽一元標(biāo)簽的屬性如下:屬性功能Property(必選)參數(shù)對象用于同compareProperty或comp

10、areValye作比較的特性Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時(shí)候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,close值將不起作用。romoveFirstPrepend(可選)該值用于決定第一個(gè)嵌套的內(nèi)容

11、生成標(biāo)簽是否有移除其prepend值一元標(biāo)簽如下:<isProperty-Available>確定參數(shù)對象中是否存在所指定的字段。對于bean,它尋找一個(gè)特性;對象map,它尋找一個(gè)鍵。<isNotProperty-Available>確定參數(shù)對象中是否不存在所指定的字段。對于bean,它尋找一個(gè)特性;對象map,它尋找一個(gè)鍵。<isNull>確定參數(shù)對象中是否為空。對于bean,它尋找一個(gè)特性;對象map,它尋找一個(gè)鍵。<isNotNull>確定參數(shù)對象中是否不為空。對于bean,它尋找一個(gè)特性;對象map,它尋找一個(gè)鍵。<isEmpty

12、>確定參數(shù)對象中是否為空、空字符串、空集合或空的String.valueOf().<isNotEmpty>確定參數(shù)對象中是否為非空、非空字符串、非空集合或非空的String.valueOf().使用示例如下:6.4 參數(shù)標(biāo)簽參數(shù)標(biāo)簽的屬性如下:屬性功能Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時(shí)候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”

13、,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,close值將不起作用。romoveFirstPrepend(可選)該值用于決定第一個(gè)嵌套的內(nèi)容生成標(biāo)簽是否有移除其prepend值參數(shù)標(biāo)簽如下:標(biāo)簽說明<isParameterPresent>確定參數(shù)對象是否存在<isNotParameterPresent>確定參數(shù)對象是否不存在使用示例如下:6.5<itetate標(biāo)簽>itetate標(biāo)簽的屬性如下:屬性功能Property(必選)參數(shù)對象用于同comparePr

14、operty或compareValye作比較的特性Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時(shí)候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時(shí)候,close值將不起作用。Conjunction(可選)連接遍歷集合(數(shù)組)

15、時(shí)重復(fù)產(chǎn)生的那些SQL片段romoveFirstPrepend(可選)該值用于決定第一個(gè)嵌套的內(nèi)容生成標(biāo)簽是否有移除其prepend值使用示例如下:7、讀取CLOB和BLOB字段在使用Oracle數(shù)據(jù)庫時(shí),讀取CLOB和BLOB等大類型的數(shù)據(jù)一直是個(gè)比較犯難的事,一般都是通過JDBC代碼來實(shí)現(xiàn)對CLOB和BLOB數(shù)據(jù)的讀寫,效果和性能都是最好的,但是代碼也相當(dāng)復(fù)雜,且代碼難以重用。7.1使用Spring的OracleLobHandler類處理采用這種方法只對數(shù)據(jù)源是直接連接Oracle 的JDBC驅(qū)動(dòng)方式有效,如果你采用數(shù)據(jù)連接池作為數(shù)據(jù)源,則這種辦法無效。根據(jù)我們公司的BSS3.0的情況使用可能性不大。所以這里不作介紹了。7.2實(shí)現(xiàn)Ibatis的TypeHandlerCallback接口sqlMap 的配置如下:說明:通過實(shí)現(xiàn)ibatis的回調(diào)接口來實(shí)現(xiàn),也有一定的局限性,需要新增一個(gè)類,配置也不方便,還可能會(huì)出錯(cuò)。7.3通過配置ParameterMap和ResultMap來實(shí)現(xiàn)對LOB類型

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論