成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iBATIS動態映射淺析

開發 后端
iBATIS動態映射是怎么回事呢?下面我們通過這篇文檔向你介紹實際操作中iBATIS動態映射的情況。

iBATIS動態映射都是用在復雜查詢過程中,我們常常需要根據用戶的選擇決定查詢條件,這里發生變化的并不只是SQL 中的參數,包括Select 語句中所包括的字段和限定條件,都可能發生變化。典型情況,如在一個復雜的組合查詢頁面,我們必須根據用戶的選擇和輸入決定查詢的條件組合。

iBATIS動態映射的一個典型的頁面如下:

對于這個組合查詢頁面,根據用戶選擇填寫的內容,我們應為其生成不同的查詢語句。如用戶沒有填寫任何信息即提交查詢請求,我們應該返回所有記錄:

Select * from t_user;

如用戶只在頁面上填寫了姓名“Erica”,我們應該生成類似:

Select * from t_user where name like ‘%Erica%’ ;的SQL查詢語句。

如用戶只在頁面上填寫了地址“Beijing”,我們應該生成類似:

Select * from t_user where address like ‘%Beijing%”;的SQL。

而如果用戶同時填寫了姓名和地址(”Erica”&’Beijing’),則我們應生成類似:

Select * from t_user where name like ‘%Erica%’ and address like ‘%Beijing%”的SQL查詢語句。

對于iBATIS 這樣需要預先指定SQL 語句的ORM 實現而言,傳統的做法無非通過if-else 語句對輸入參數加以判定,然后針對用戶選擇調用不同的statement 定義。對于上面這種簡單的情況(兩種查詢條件的排列組合,共4 種情況)而言,statement 的重復定義工作已經讓人不厭其煩,而對于動輒擁有七八個查詢條件,乃至十幾個查詢條件

的排列組合而言,瑣碎反復的statement定義實在讓人不堪承受。

考慮到這個問題,iBATIS引入了動態映射機制,即在statement定義中,根據不同的

iBATIS動態映射查詢參數,設定對應的SQL語句。

還是以上面的示例為例:

select

id,

name,

sex

from t_user

(name like #name#)

(address like #address#)

通過dynamic 節點,我們定義了一個動態的WHERE 子句。此WHERE 子句中將

可能包含兩個針對name 和address 字段的判斷條件。而這兩個字段是否加入檢索取決于用戶所提供的查詢條件(字段是否為空[isNotEmpty])。

對于一個典型的Web程序而言,我們通過HttpServletRequest獲得表單中的字段名并將其設入查詢參數,如:

user.setName(request.getParameter("name"));

user.setAddress(request.getParameter("address"));

sqlMap.queryForList("User.getUsers", user);

在執行queryForList("User.getUsers", user)時,ibatis 即根據配置文

件中設定的SQL動態生成規則,創建相應的SQL語句。

上面的示例中,我們通過判定節點isNotEmpty,指定了關于name 和address 屬

性的動態規則:

(name like #name#)

這個節點對應的語義是,如果參數類的"name"屬性非空(isNotEmpty,即非空

字符串””),則在生成的SQL Where字句中包括判定條件(name like #name#),其

中#name#將以參數類的name屬性值填充。

Address屬性的判定生成與name屬性完全相同,這里就不再贅述。

這樣,我們通過在statement 定義中引入dynamic 節點,很簡單的實現了SQL 判定子句的動態生成,對于復雜的組合查詢而言,這將帶來極大的便利。判定節點的定義可以非常靈活,我們甚至可以使用嵌套的判定節點來實現復雜的動態映射,如:

( name=#name#address=#address#)

這段定義規定,只有用戶提供了姓名信息時,才能結合地址數據進行查詢(如果只提供地址數據,而將姓名信息忽略,將依然被視為全檢索)。Dynamic節點和判定節點中的prepend屬性,指明了本節點中定義的SQL子句在

主體SQL中出現時的前綴。如:

(name like #name#)

(address like #address#)

假設"name"屬性的值為“Erica”, "address"屬性的值為“Beijing”,則會生成類似下面的SQL子句(實際運行期將生成帶占位符的PreparedStatement,之后再為其填充數據):

WHERE (name like ‘Beijing’) AND (address like ‘Beijing’)

其中WHERE 之后的語句是在dynamic 節點中所定義,因此以dynamic 節點的prepend設置("WHERE")作為前綴,而其中的”AND”,實際上是address屬性所對應的isNotEmpty節點的prepend設定,它***了對應節點中定義的SQL子句。至于name屬性對應的isNotEmpty節點,由于iBATIS會自動判定是否需要追加prepend前綴,這里(name like #name#)是WHERE 子句中的***個條件子句,無需AND 前綴,所以自動省略。

判定節點并非僅限于isNotEmpty,iBATIS中提供了豐富的判定定義功能。判定節點分兩類:

Ø 一元判定

一元判定是針對屬性值本身的判定,如屬性是否為NULL,是否為空值等。

上面示例中isNotEmpty就是典型的一元判定。

一元判定節點有:

節點名 描述

參數類中是否提供了此屬性

與相反

屬性值是否為NULL

與相反

如果屬性為Collection或者String,其size是否 與相反。

Ø 二元判定

二元判定有兩個判定參數,一是屬性名,而是判定值,如

(age=#age#)

其中,property="age"指定了屬性名”age”,compareValue=”18”指明了判定值為”18”。上面判定節點isGreaterThan 對應的語義是:如果age 屬性大于18(compareValue),則在SQL中加入(age=#age#)條件。

二元判定節點有:

節點名 屬性值與compareValues的關系

相等。

不等。

大于。

大于等于。

小于。

小于等于。

iBATIS動態映射的情況我們就介紹到這里,希望這篇關于iBATIS動態映射的文檔對你認識iBATIS動態映射有幫助。

【編輯推薦】

  1. iBATIS操作CLOB字段實戰淺析
  2. iBATIS for Eclipse設置淺析
  3. iBATIS的自動代碼生成工具Abator在Eclipse的應用
  4. iBATIS事務處理淺析
  5. iBatis和Hibernate的較量淺析
責任編輯:仲衡 來源: JavaEye
相關推薦

2009-07-22 13:04:41

iBATIS動態查詢

2009-07-21 17:39:50

iBATIS的多對多映

2009-07-20 14:56:18

iBATIS.NET動態選擇DAO

2009-07-21 11:12:00

iBATIS配置

2009-07-20 13:47:08

iBATIS.NET字

2009-07-16 09:14:26

iBATIS DAO

2009-07-15 17:19:31

iBATIS Ecli

2009-07-17 10:32:45

iBATIS MapB

2009-07-22 10:03:11

iBATIS Resu

2009-07-20 18:00:16

iBATIS DAO事

2009-07-20 16:41:27

Struts2.0+i

2009-07-22 10:42:59

iBATIS Cach

2009-07-16 10:23:30

iBATIS工作原理

2009-07-16 13:08:09

iBATIS快速創建應

2009-07-22 15:21:00

iBATIS SQLM

2009-07-15 16:42:03

iBATIS讀寫CLO

2009-07-17 17:05:44

iBATIS緩存cacheModel

2009-07-22 09:44:05

iBATIS Para

2009-07-17 10:59:59

iBATIS接口

2009-07-22 16:02:14

iBATIS參數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产日本 | 自拍偷拍中文字幕 | 亚洲日韩欧美一区二区在线 | 国产精品福利视频 | 国产精品毛片久久久久久 | 欧美成年视频 | 国产婷婷精品 | 人人澡人人射 | 国产日屁 | 有码一区 | 亚洲成人中文字幕 | 亚洲日韩欧美一区二区在线 | 精品一区二区不卡 | 福利视频一区二区 | 综合一区二区三区 | 免费看91 | 日本久久精品视频 | 免费一级毛片 | 亚洲美女天堂网 | 黄色中文字幕 | 国产激情91久久精品导航 | 一级网站 | 一区二区三区在线观看视频 | 久在线| 国产乱码精品一区二区三区中文 | 性高湖久久久久久久久 | 99爱在线观看 | 亚洲bt 欧美bt 日本bt | 日韩视频―中文字幕 | 日韩欧美亚洲 | 91在线精品一区二区 | 一区二区三区视频在线观看 | 在线中文字幕av | 草久网| 日韩欧美三级电影 | 国产福利在线看 | 国产免费一区二区三区网站免费 | 福利视频亚洲 | 波多野结衣一二三区 | 久久综合一区二区 | h视频在线免费看 |