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

iBATIS動(dòng)態(tài)映射淺析

開(kāi)發(fā) 后端
iBATIS動(dòng)態(tài)映射是怎么回事呢?下面我們通過(guò)這篇文檔向你介紹實(shí)際操作中iBATIS動(dòng)態(tài)映射的情況。

iBATIS動(dòng)態(tài)映射都是用在復(fù)雜查詢(xún)過(guò)程中,我們常常需要根據(jù)用戶(hù)的選擇決定查詢(xún)條件,這里發(fā)生變化的并不只是SQL 中的參數(shù),包括Select 語(yǔ)句中所包括的字段和限定條件,都可能發(fā)生變化。典型情況,如在一個(gè)復(fù)雜的組合查詢(xún)頁(yè)面,我們必須根據(jù)用戶(hù)的選擇和輸入決定查詢(xún)的條件組合。

iBATIS動(dòng)態(tài)映射的一個(gè)典型的頁(yè)面如下:

對(duì)于這個(gè)組合查詢(xún)頁(yè)面,根據(jù)用戶(hù)選擇填寫(xiě)的內(nèi)容,我們應(yīng)為其生成不同的查詢(xún)語(yǔ)句。如用戶(hù)沒(méi)有填寫(xiě)任何信息即提交查詢(xún)請(qǐng)求,我們應(yīng)該返回所有記錄:

Select * from t_user;

如用戶(hù)只在頁(yè)面上填寫(xiě)了姓名“Erica”,我們應(yīng)該生成類(lèi)似:

Select * from t_user where name like ‘%Erica%’ ;的SQL查詢(xún)語(yǔ)句。

如用戶(hù)只在頁(yè)面上填寫(xiě)了地址“Beijing”,我們應(yīng)該生成類(lèi)似:

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

而如果用戶(hù)同時(shí)填寫(xiě)了姓名和地址(”Erica”&’Beijing’),則我們應(yīng)生成類(lèi)似:

Select * from t_user where name like ‘%Erica%’ and address like ‘%Beijing%”的SQL查詢(xún)語(yǔ)句。

對(duì)于iBATIS 這樣需要預(yù)先指定SQL 語(yǔ)句的ORM 實(shí)現(xiàn)而言,傳統(tǒng)的做法無(wú)非通過(guò)if-else 語(yǔ)句對(duì)輸入?yún)?shù)加以判定,然后針對(duì)用戶(hù)選擇調(diào)用不同的statement 定義。對(duì)于上面這種簡(jiǎn)單的情況(兩種查詢(xún)條件的排列組合,共4 種情況)而言,statement 的重復(fù)定義工作已經(jīng)讓人不厭其煩,而對(duì)于動(dòng)輒擁有七八個(gè)查詢(xún)條件,乃至十幾個(gè)查詢(xún)條件

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

考慮到這個(gè)問(wèn)題,iBATIS引入了動(dòng)態(tài)映射機(jī)制,即在statement定義中,根據(jù)不同的

iBATIS動(dòng)態(tài)映射查詢(xún)參數(shù),設(shè)定對(duì)應(yīng)的SQL語(yǔ)句。

還是以上面的示例為例:

select

id,

name,

sex

from t_user

(name like #name#)

(address like #address#)

通過(guò)dynamic 節(jié)點(diǎn),我們定義了一個(gè)動(dòng)態(tài)的WHERE 子句。此WHERE 子句中將

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

對(duì)于一個(gè)典型的Web程序而言,我們通過(guò)HttpServletRequest獲得表單中的字段名并將其設(shè)入查詢(xún)參數(shù),如:

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

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

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

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

件中設(shè)定的SQL動(dòng)態(tài)生成規(guī)則,創(chuàng)建相應(yīng)的SQL語(yǔ)句。

上面的示例中,我們通過(guò)判定節(jié)點(diǎn)isNotEmpty,指定了關(guān)于name 和address 屬

性的動(dòng)態(tài)規(guī)則:

(name like #name#)

這個(gè)節(jié)點(diǎn)對(duì)應(yīng)的語(yǔ)義是,如果參數(shù)類(lèi)的"name"屬性非空(isNotEmpty,即非空

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

中#name#將以參數(shù)類(lèi)的name屬性值填充。

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

這樣,我們通過(guò)在statement 定義中引入dynamic 節(jié)點(diǎn),很簡(jiǎn)單的實(shí)現(xiàn)了SQL 判定子句的動(dòng)態(tài)生成,對(duì)于復(fù)雜的組合查詢(xún)而言,這將帶來(lái)極大的便利。判定節(jié)點(diǎn)的定義可以非常靈活,我們甚至可以使用嵌套的判定節(jié)點(diǎn)來(lái)實(shí)現(xiàn)復(fù)雜的動(dòng)態(tài)映射,如:

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

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

主體SQL中出現(xiàn)時(shí)的前綴。如:

(name like #name#)

(address like #address#)

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

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

其中WHERE 之后的語(yǔ)句是在dynamic 節(jié)點(diǎn)中所定義,因此以dynamic 節(jié)點(diǎn)的prepend設(shè)置("WHERE")作為前綴,而其中的”AND”,實(shí)際上是address屬性所對(duì)應(yīng)的isNotEmpty節(jié)點(diǎn)的prepend設(shè)定,它***了對(duì)應(yīng)節(jié)點(diǎn)中定義的SQL子句。至于name屬性對(duì)應(yīng)的isNotEmpty節(jié)點(diǎn),由于iBATIS會(huì)自動(dòng)判定是否需要追加prepend前綴,這里(name like #name#)是WHERE 子句中的***個(gè)條件子句,無(wú)需AND 前綴,所以自動(dòng)省略。

判定節(jié)點(diǎn)并非僅限于isNotEmpty,iBATIS中提供了豐富的判定定義功能。判定節(jié)點(diǎn)分兩類(lèi):

Ø 一元判定

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

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

一元判定節(jié)點(diǎn)有:

節(jié)點(diǎn)名 描述

參數(shù)類(lèi)中是否提供了此屬性

與相反

屬性值是否為NULL

與相反

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

Ø 二元判定

二元判定有兩個(gè)判定參數(shù),一是屬性名,而是判定值,如

(age=#age#)

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

二元判定節(jié)點(diǎn)有:

節(jié)點(diǎn)名 屬性值與compareValues的關(guān)系

相等。

不等。

大于。

大于等于。

小于。

小于等于。

iBATIS動(dòng)態(tài)映射的情況我們就介紹到這里,希望這篇關(guān)于iBATIS動(dòng)態(tài)映射的文檔對(duì)你認(rèn)識(shí)iBATIS動(dòng)態(tài)映射有幫助。

【編輯推薦】

  1. iBATIS操作CLOB字段實(shí)戰(zhàn)淺析
  2. iBATIS for Eclipse設(shè)置淺析
  3. iBATIS的自動(dòng)代碼生成工具Abator在Eclipse的應(yīng)用
  4. iBATIS事務(wù)處理淺析
  5. iBatis和Hibernate的較量淺析
責(zé)任編輯:仲衡 來(lái)源: JavaEye
相關(guān)推薦

2009-07-22 13:04:41

iBATIS動(dòng)態(tài)查詢(xún)

2009-07-21 17:39:50

iBATIS的多對(duì)多映

2009-07-20 14:56:18

iBATIS.NET動(dòng)態(tài)選擇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-22 10:42:59

iBATIS Cach

2009-07-16 10:23:30

iBATIS工作原理

2009-07-20 16:41:27

Struts2.0+i

2009-07-16 13:08:09

iBATIS快速創(chuàng)建應(yīng)

2009-07-22 15:21:00

iBATIS SQLM

2009-07-15 16:42:03

iBATIS讀寫(xiě)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參數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品少妇一区二区三区在线播放 | 久久精品国产99国产 | 亚洲欧美日韩国产综合 | 久久久不卡网国产精品一区 | 国产精品久久久免费 | 欧美日韩网站 | 亚洲精品久久久久久首妖 | 欧美精品一区二区三区视频 | 精品国产久 | 午夜噜噜噜 | 一区二区在线免费观看 | 国产一区三区在线 | 一区二区日本 | 中文字幕亚洲一区二区三区 | 亚洲网址在线观看 | 久久伊人在| 蜜桃特黄a∨片免费观看 | 人人人干 | 久久精品国产免费 | 亚洲日本一区二区三区四区 | 国产精品一区二区三区久久 | 精品国产青草久久久久福利 | 欧美综合在线观看 | 三级国产三级在线 | 日本欧美在线观看视频 | 91国语清晰打电话对白 | 亚洲国产18 | 国产欧美在线观看 | 成人精品国产免费网站 | 华丽的挑战在线观看 | 日韩欧美国产一区二区 | 国产欧美精品 | 久久国产日韩 | 黄a网 | 欧美一级片在线观看 | 五月天激情电影 | 成年人免费在线视频 | 成人做爰69片免费观看 | 91高清在线视频 | 日韩在线免费观看视频 | 国产日韩一区二区 |