轉(zhuǎn)帖|其它|編輯:郝浩|2011-07-25 15:04:10.000|閱讀 338 次
概述:iBATIS動態(tài)映射都是用在復雜查詢過程中,我們常常需要根據(jù)用戶的選擇決定查詢條件,這里發(fā)生變化的并不只是SQL 中的參數(shù),包括Select 語句中所包括的字段和限定條件,都可能發(fā)生變化。典型情況,如在一個復雜的組合查詢頁面,我們必須根據(jù)用戶的選擇和輸入決定查詢的條件組合。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
iBATIS動態(tài)映射都是用在復雜查詢過程中,我們常常需要根據(jù)用戶的選擇決定查詢條件,這里發(fā)生變化的并不只是SQL 中的參數(shù),包括Select 語句中所包括的字段和限定條件,都可能發(fā)生變化。典型情況,如在一個復雜的組合查詢頁面,我們必須根據(jù)用戶的選擇和輸入決定查詢的條件組合。
iBATIS動態(tài)映射的一個典型的頁面如下:
對于這個組合查詢頁面,根據(jù)用戶選擇填寫的內(nèi)容,我們應(yīng)為其生成不同的查詢語句。如用戶沒有填寫任何信息即提交查詢請求,我們應(yīng)該返回所有記錄:
Select * from t_user;
如用戶只在頁面上填寫了姓名“Erica”,我們應(yīng)該生成類似:
Select * from t_user where name like ‘%Erica%’ ;的SQL查詢語句。
如用戶只在頁面上填寫了地址“Beijing”,我們應(yīng)該生成類似:
Select * from t_user where address like ‘%Beijing%”;的SQL。
而如果用戶同時填寫了姓名和地址(”Erica”&’Beijing’),則我們應(yīng)生成類似:
Select * from t_user where name like ‘%Erica%’ and address like ‘%Beijing%”的SQL查詢語句。
對于iBATIS 這樣需要預(yù)先指定SQL 語句的ORM 實現(xiàn)而言,傳統(tǒng)的做法無非通過if-else 語句對輸入?yún)?shù)加以判定,然后針對用戶選擇調(diào)用不同的statement 定義。對于上面這種簡單的情況(兩種查詢條件的排列組合,共4 種情況)而言,statement 的重復定義工作已經(jīng)讓人不厭其煩,而對于動輒擁有七八個查詢條件,乃至十幾個查詢條件的排列組合而言,瑣碎反復的statement定義實在讓人不堪承 受。
考慮到這個問題,iBATIS引入了動態(tài)映射機制,即在statement定義中,根據(jù)不同的iBATIS動態(tài)映射查詢參數(shù),設(shè)定對應(yīng)的SQL語句。還是以上面的示例為例:
select
id,
name,
sex
from t_user
(name like #name#)
(address like #address#)
通過dynamic 節(jié)點,我們定義了一個動態(tài)的WHERE 子句。此WHERE 子句中將可能包含兩個針對name 和address 字段的判斷條件。而這兩個字段是否加入檢索取決于用戶所提供的查詢條件(字段是否為空[isNotEmpty])。
對于一個典型的Web程序而言,我們通過HttpServletRequest獲得表單中的字段名并將其設(shè)入查詢參數(shù),如:
user.setName(request.getParameter("name"));
user.setAddress(request.getParameter("address"));
sqlMap.queryForList("User.getUsers", user);
在執(zhí)行queryForList("User.getUsers", user)時,ibatis 即根據(jù)配置文件中設(shè)定的SQL動態(tài)生成規(guī)則,創(chuàng)建相應(yīng)的SQL語句。
上面的示例中,我們通過判定節(jié)點isNotEmpty,指定了關(guān)于name 和address 屬性的動態(tài)規(guī)則:(name like #name#)
這個節(jié)點對應(yīng)的語義是,如果參數(shù)類的"name"屬性非空(isNotEmpty,即非空字符串””),則在生成的SQL Where字句中包括判定條件(name like #name#),其中#name#將以參數(shù)類的name屬性值填充。
Address屬性的判定生成與name屬性完全相同,這里就不再贅述。
這樣,我們通過在statement 定義中引入dynamic 節(jié)點,很簡單的實現(xiàn)了SQL 判定子句的動態(tài)生成,對于復雜的組合查詢而言,這將帶來極大的便利。判定節(jié)點的定義可以非常靈活,我們甚至可以使用嵌套的判定節(jié)點來實現(xiàn)復雜的動態(tài)映射,如:
( name=#name#address=#address#)
這段定義規(guī)定,只有用戶提供了姓名信息時,才能結(jié)合地址數(shù)據(jù)進行查詢(如果只提供地址數(shù)據(jù),而將姓名信息忽略,將依然被視為全檢索)。Dynamic節(jié)點和判定節(jié)點中的prepend屬性,指明了本節(jié)點中定義的SQL子句在主體SQL中出現(xiàn)時的前綴。如:
(name like #name#)
(address like #address#)
假設(shè)"name"屬性的值為“Erica”, "address"屬性的值為“Beijing”,則會生成類似下面的SQL子句(實際運行期將生成帶占位符的PreparedStatement,之后再為其填充數(shù)據(jù)):
WHERE (name like ‘Beijing’) AND (address like ‘Beijing’)
其中WHERE 之后的語句是在dynamic 節(jié)點中所定義,因此以dynamic 節(jié)點的prepend設(shè)置("WHERE")作為前綴,而其中的”AND”,實際上是address屬性所對應(yīng)的isNotEmpty節(jié)點的 prepend設(shè)定,它引領(lǐng)了對應(yīng)節(jié)點中定義的SQL子句。至于name屬性對應(yīng)的isNotEmpty節(jié)點,由于iBATIS會自動判定是否需要追加 prepend前綴,這里(name like #name#)是WHERE 子句中的第一個條件子句,無需AND 前綴,所以自動省略。
判定節(jié)點并非僅限于isNotEmpty,iBATIS中提供了豐富的判定定義功能。判定節(jié)點分兩類:
一元判定
一元判定是針對屬性值本身的判定,如屬性是否為NULL,是否為空值等。
上面示例中isNotEmpty就是典型的一元判定。
一元判定節(jié)點有:
節(jié)點名 描述
參數(shù)類中是否提供了此屬性
與相反
屬性值是否為NULL
與相反
如果屬性為Collection或者String,其size是否 與相反。
二元判定
二元判定有兩個判定參數(shù),一是屬性名,而是判定值,如
(age=#age#)
其中,property="age"指定了屬性名”age”,compareValue=”18”指明了判定值為”18”。上面判定節(jié)點 isGreaterThan 對應(yīng)的語義是:如果age 屬性大于18(compareValue),則在SQL中加入(age=#age#)條件。
二元判定節(jié)點有:
節(jié)點名 屬性值與compareValues的關(guān)系
相等。
不等。
大于。
大于等于。
小于。
小于等于。
iBATIS動態(tài)映射的情況我們就介紹到這里,希望這篇關(guān)于iBATIS動態(tài)映射的文檔對你認識iBATIS動態(tài)映射有幫助。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載