版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、iBATIS高級特性1、主要內(nèi)容l 關(guān)聯(lián)對象l 事務(wù)l 延遲加載l 緩存l 動態(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是否提供同樣的功能呢?這是大部分人會關(guān)心的內(nèi)容。 答案也許是另人失望的。iBATIS可以關(guān)聯(lián)查詢,卻沒有提供級聯(lián)保存和級聯(lián)刪除的特性。 下面我們介紹如何處理關(guān)聯(lián)對象之間的查詢、保存及刪除問題。 關(guān)聯(lián)查詢iBatis為我們提供了兩種方式關(guān)聯(lián)查詢,第一種N+1次查詢,第二種新支持的查詢方式。兩種方式需要根據(jù)具體的應(yīng)用環(huán)境,作出合適的選擇。前一種由于多了
2、一次和數(shù)據(jù)庫的讀取操作,所以讀取速度慢了些,但是可以使用延遲加載減少內(nèi)存的消耗。而后一種方式多了些內(nèi)存消耗,但是讀取速度要快了。定義一個需求:我們在查詢訂單的同時希望查詢出其關(guān)聯(lián)的訂單項。 采用N+1次查詢首先看看我們的SQL Mapped配置文件如何配置的:我們可以看到,RESULT的select屬性指向一個新的查詢語句。說明:這個很好的解決了關(guān)聯(lián)查詢的問題,而且如果我們配置了全局的延遲加載,當(dāng)真正用到訂單項的時候,iBatis才為我們做查詢的動作。但是這卻帶來了另外一個問題,N+1次查詢的問題。也就是多了一次數(shù)據(jù)庫的讀操作,有一定的性能損失。 新查詢方式首先看看我們的SQL Mapped配
3、置文件如何配置的:我們可以看到,RESULT的resultMap屬性指向一個resultMap標(biāo)簽定義。說明:與前面N+1次查詢方式比較,由于只讀取數(shù)據(jù)庫一次,的確讀取速度更快了,但是由于存在更多的內(nèi)存消耗(N+1方式可以通過延遲加載來減少內(nèi)存的消耗),所以我們該根據(jù)具體的應(yīng)用情況而選擇合適的方式。2.2 級聯(lián)保存在Hibernate中,我們可以使用級聯(lián)保存,而iBATIS并沒有提供該功能特性,此時我們需要自己保存關(guān)聯(lián)的對象數(shù)據(jù)。定義一個需求:在保存訂單的時候,希望一起保存其關(guān)聯(lián)的訂單項。其DAO層可以定義如下兩個方法分別保存訂單和關(guān)聯(lián)的訂單項:BMO層可以作如下調(diào)用:這里涉及到的事務(wù)等后面講
4、解事務(wù)的時候再說明如何實現(xiàn)。2.3 級聯(lián)刪除 同樣iBatis未提供級連刪除的特性,我們要刪除連關(guān)聯(lián)表一起刪除,也需要自己實現(xiàn),其方式和保存類似,第一次刪除關(guān)聯(lián)的子表如訂單項,再刪除其主表如訂單。 3、事務(wù)自動事務(wù)所謂自己事務(wù),就是說Ibatis API單個方法自動劃分為一個事務(wù),不需要顯示的開始、提交、結(jié)束。其主要針對一種應(yīng)用程序、一個資源、且一次只能處理一個事務(wù)。如圖:其配置如下:實現(xiàn)方式:說明:在Spring已經(jīng)使用AOP申明式事務(wù),所以像上面的配置文件及編碼式事務(wù)使用到的可能性不大。在藍(lán)本工程的其Spring配置如下:只要SMOImpl匹配的類,其insert*、update
5、*、add*、del*將自動使用事務(wù)。事務(wù)全局事務(wù)定義了一個更大的事務(wù)范圍,它可以夸數(shù)據(jù)庫、消息隊列、甚至包含其它應(yīng)用程序。下圖展示了一個全局的事務(wù)系統(tǒng):下圖展示一個全局事務(wù)的配置方式:接口和iBATIS的局部事務(wù)相同。這樣當(dāng)需要從局部事務(wù)切換到全局事務(wù)的時候會很方方便,只要更改配置文件,不需要更改接口代碼了。4、延遲加載配置方式如下圖:該屬性默認(rèn)值為true,若該屬性值為true,當(dāng)采用N+1次查詢的時候,iBatis會在需要關(guān)聯(lián)數(shù)據(jù)的時候才開始執(zhí)行查詢。5、緩存6、動態(tài)標(biāo)簽主要分為五類動態(tài)標(biāo)簽:6.1 dynamic標(biāo)簽Dynamic可以使用的屬性如下:屬性功能Prepend(可選)該值作
6、為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時候,close值將不起作用。使用示例如下:6.2 二元標(biāo)簽二元標(biāo)簽的屬性如下:屬性功能Property(必選)參數(shù)對象用于同compareProperty或
7、compareValye作比較的特性Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時候,close值將不起作用。romoveFirstPrepend(可選)該值用于決定第一個嵌
8、套的內(nèi)容生成標(biāo)簽是否有移除其prepend值compareProperty、compareValye(兩個必有其一)用來同property特性值作比較二元動態(tài)標(biāo)簽如下:<isEqual>Property屬性與compareProperty或pareValye屬性值作比較,看是否相同<isNotEqual>Property屬性與compareProperty或pareValye屬性值作比較,看是否不同<isGreaterThan>Property屬性是否大于pareProperty或pareValye屬性值<isGreaterEqual>Prope
9、rty屬性與compareProperty或pareValye屬性值作比較,看是否相同<isLessThan>Property屬性與compareProperty或pareValye屬性值作比較,看是否相同<isLessEqual>Property屬性與compareProperty或pareValye屬性值作比較,看是否相同使用示例如下:6.3 一元標(biāo)簽一元標(biāo)簽的屬性如下:屬性功能Property(必選)參數(shù)對象用于同compareProperty或compareValye作比較的特性Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為
10、空的時候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時候,close值將不起作用。romoveFirstPrepend(可選)該值用于決定第一個嵌套的內(nèi)容生成標(biāo)簽是否有移除其prepend值一元標(biāo)簽如下:<isProperty-Available>確定參
11、數(shù)對象中是否存在所指定的字段。對于bean,它尋找一個特性;對象map,它尋找一個鍵。<isNotProperty-Available>確定參數(shù)對象中是否不存在所指定的字段。對于bean,它尋找一個特性;對象map,它尋找一個鍵。<isNull>確定參數(shù)對象中是否為空。對于bean,它尋找一個特性;對象map,它尋找一個鍵。<isNotNull>確定參數(shù)對象中是否不為空。對于bean,它尋找一個特性;對象map,它尋找一個鍵。<isEmpty>確定參數(shù)對象中是否為空、空字符串、空集合或空的String.valueOf().<isNotEmp
12、ty>確定參數(shù)對象中是否為非空、非空字符串、非空集合或非空的String.valueOf().使用示例如下:6.4 參數(shù)標(biāo)簽參數(shù)標(biāo)簽的屬性如下:屬性功能Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后
13、。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時候,close值將不起作用。romoveFirstPrepend(可選)該值用于決定第一個嵌套的內(nèi)容生成標(biāo)簽是否有移除其prepend值參數(shù)標(biāo)簽如下:標(biāo)簽說明<isParameterPresent>確定參數(shù)對象是否存在<isNotParameterPresent>確定參數(shù)對象是否不存在使用示例如下:6.5<itetate標(biāo)簽>itetate標(biāo)簽的屬性如下:屬性功能Property(必選)參數(shù)對象用于同compareProperty或compareValye作比較的特性Prepend(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。但
14、是當(dāng)標(biāo)簽的結(jié)果內(nèi)容體為空的時候,prpend值將不其作用。Open(可選)該值作為前綴添加到標(biāo)簽的結(jié)果內(nèi)容提前。如果結(jié)果內(nèi)容體為空的時候,open值將不被附加到其前面。Open值將在prepend屬性值被添加到前綴之前先被添加前綴。例如假設(shè)prepend=”when”,而open=”(”,則最終得到的組合是”when (“。Close(可選)該值作為后綴添加到標(biāo)簽的結(jié)果內(nèi)容提后。如果標(biāo)簽的結(jié)果內(nèi)容體為空的時候,close值將不起作用。Conjunction(可選)連接遍歷集合(數(shù)組)時重復(fù)產(chǎn)生的那些SQL片段romoveFirstPrepend(可選)該值用于決定第一個嵌套的內(nèi)容生成標(biāo)簽是否有
15、移除其prepend值使用示例如下:7、讀取CLOB和BLOB字段在使用Oracle數(shù)據(jù)庫時,讀取CLOB和BLOB等大類型的數(shù)據(jù)一直是個比較犯難的事,一般都是通過JDBC代碼來實現(xiàn)對CLOB和BLOB數(shù)據(jù)的讀寫,效果和性能都是最好的,但是代碼也相當(dāng)復(fù)雜,且代碼難以重用。使用Spring的OracleLobHandler類處理采用這種方法只對數(shù)據(jù)源是直接連接Oracle 的JDBC驅(qū)動方式有效,如果你采用數(shù)據(jù)連接池作為數(shù)據(jù)源,則這種辦法無效。根據(jù)我們公司的BSS3.0的情況使用可能性不大。所以這里不作介紹了。實現(xiàn)Ibatis的TypeHandlerCallback接口sqlMap 的配置如下:說明:通過實現(xiàn)ibatis的回調(diào)接口來實現(xiàn),也有一定的局限性,需要新增一個類,配置也不方便,還可能會出錯。通過配置ParameterMap和ResultMap來實現(xiàn)對LOB類型的讀寫
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 配電網(wǎng)負(fù)荷動態(tài)平衡技術(shù)
- 保險行業(yè)數(shù)字化轉(zhuǎn)型模板
- 職業(yè)導(dǎo)論-2018-2019年房地產(chǎn)經(jīng)紀(jì)人《職業(yè)導(dǎo)論》真題匯編
- 房地產(chǎn)交易制度政策-《房地產(chǎn)基本制度與政策》真題匯編4
- 要怎么寫問卷調(diào)查報告
- 人教版三年級數(shù)學(xué)下冊第三單元復(fù)式統(tǒng)計表綜合卷(含答案)
- 山西省朔州市部分學(xué)校2024-2025學(xué)年八年級上學(xué)期期末生物學(xué)試卷(含答案)
- 產(chǎn)權(quán)技術(shù)合同在跨國技術(shù)轉(zhuǎn)移中的法律風(fēng)險與防范
- 蘇州中考英語模擬試卷單選題及答案
- 二零二五版房屋遺產(chǎn)繼承分配與拆除重建工程融資合同3篇
- 成品可靠性測試計劃
- 漢聲數(shù)學(xué)繪本《數(shù)是怎么來的》
- 人工智能基礎(chǔ)與應(yīng)用課件
- 仿制藥一致性評價
- 【譯林版】六年級英語(下冊)單詞默寫單
- 計算機(jī)二級wps題庫及答案
- 整套課件:工業(yè)催化
- 爆破安全管理知識培訓(xùn)
- 旅游地理學(xué)教案
- 煤矸石綜合利用途徑課件
- 企業(yè)信息公示聯(lián)絡(luò)員備案申請表
評論
0/150
提交評論