下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、MyBatis動態(tài)Sql語句MyBatis中對數(shù)據(jù)庫的操作,有時要帶一些條件,因此動態(tài)SQL語句非常有必要,下面就主要來講講幾個常用的動態(tài)SQL語句的語法MyBatis中用于實現(xiàn)動態(tài)SQL的元素主要有:ifchoose(when,otherwise)trimwheresetforeach1、if對屬性進行判斷,如果不為空則執(zhí)行判斷條件htmlviewplaincopyparameterType="com.mucfc.dto.Student"<selectid="selectByCriteria"resultMap="BaseResultM
2、ap">select*fromt_studentwhere<iftest="stuId!=nullandstuId!=''">STU_ID=#stuId</if><iftest="stuName!=nullandstuName!=''">andSTU_NAME=#stuName</if><iftest="stuClass!=nullandstuClass!=''">andSTU_CLASS=#stuClass&l
3、t;/if><iftest="stuSex!=nullandstuSex!=''">andSTU_SEX=#stuSex</if><iftest="stuAge!=nullandstuAge!=''">andSTU_AGE=#stuAge</if></select>來看看結(jié)果:這是從web頁面輸入的參數(shù)這是輸出的結(jié)果這是打印出來的Sql語句從結(jié)果可以看出,只有在條件不為空的時候,屬性才會賦值。2、where當(dāng)where中的條件使用的if標簽較多時,這樣的組合
4、可能會導(dǎo)致錯誤。我們以在1中的查詢語句為例子,當(dāng)輸入?yún)?shù)stuId為空時,就會報錯然后是輸出的結(jié)果:此時SQL語句變成了select*fromt_studentwhereandSTU_SEX=?這樣會報錯如果上面例子,參數(shù)stuId為null,將不會進行STUDENT_NAME列的判斷,則會直接導(dǎo)“WHEREAND'關(guān)鍵字多余的錯誤SQL這時我們可以使用where動態(tài)語句來解決。這個"where”標簽會知道如果它包含的標簽中有返回值的話,它就插入一個where'。此外,如果標簽返回的內(nèi)容是以AND或OR開頭的,則它會剔除掉??梢愿某扇缦拢篽tmlviewplainco
5、py<selectid="selectByCriteria"parameterType="com.mucfc.dto.Student"resultMap="BaseResultMap">select*fromt_student<where><iftest="stuId!=nullandstuId!=''">STU_ID=#stuId</if><iftest="stuName!=nullandstuName!=''&quo
6、t;>andSTU_NAME=#stuName</if><iftest="stuClass!=nullandstuClass!=''">andSTU_CLASS=#stuClass</if><iftest="stuSex!=nullandstuSex!=''">andSTU_SEX=#stuSex</if><iftest="stuAge!=nullandstuAge!=''">andSTU_AGE=#stuAg
7、e</if></where></select>再來看看,輸入查詢條件然后輸出結(jié)果打印出來的SQL語句-=>Preparing:select*fromt_studentWHERESTU_SEX=?=>Parameters:男(String)<=Total:14說明結(jié)果是正確的。如果它包含的標簽中有返回值的話就插入一個where。此外如果標簽返回的內(nèi)容是以AND或OR開頭的,則它會剔除掉。3、set當(dāng)update語句中沒有使用if標簽時,如果有一個參數(shù)為null,都會導(dǎo)致錯誤。當(dāng)在update語句中使用if標簽時,如果前面的if沒有執(zhí)行,則或?qū)?/p>
8、致逗號多余錯誤。使用set標簽可以將動態(tài)的配置SET關(guān)鍵字,和剔除追加到條件末尾的任何不相關(guān)的逗號。使用if+set標簽修改后,如果某項為null則不進行更新,而是保持數(shù)據(jù)庫原值。如下示例:4、trimwhere和set的效果。parameterType="com.mucfc.dto.Student"trim是更靈活的去處多余關(guān)鍵字的標簽,他可以實踐htmlviewplaincopy<selectid="selectByCriteria"resultMap="BaseResultMap">select*fromt_stud
9、ent<trimprefix="where"prefixOverrides="AND|OR"><iftest="stuId!=nullandstuId!=''">STU_ID=#stuId</if><iftest="stuName!=nullandstuName!=''">andSTU_NAME=#stuName</if><iftest="stuClass!=nullandstuClass!='
10、9;">andSTU_CLASS=#stuClass</if><iftest="stuSex!=nullandstuSex!=''">andSTU_SEX=#stuSex</if><iftest="stuAge!=nullandstuAge!=''">andSTU_AGE=#stuAge</if></trim></select>where后面有and或者or,就自動把首先判斷是否需要where,如果需要,它會自動判斷如果它們
11、都去掉。prefix是前置的,還有suffix是后置的。如下輸入查找參數(shù)stuclass=2??纯创蛴〕鰜淼恼Z句suffix是后置的例子htmlviewplaincopy<insertid="insert"parameterType="com.mucfc.dto.Student">insertintot_student<trimprefix="("suffix=")"suffixOverrides=","><iftest="stuId!=null"
12、;>STU_ID,</if><iftest="stu_name!=null">STU_NAME,</if></trim><trimprefix="values("suffix=")"suffixOverrides=","><iftest="stuId!=null">#stuId,</if><iftest="stu_name!=null">#stu_name,</if&g
13、t;<prename="code"class="html"></insert</pre><br>這里是自動判斷是否為空,然后去掉逗號htmlviewplaincopyprefix="("suffix=")"會自動判斷是否需要加上()這個符號5、 choose有時候我們并不想應(yīng)用所有的條件,而只是想從多個選項中選擇一個。而使用if標簽時,只要test中的表達式為true,就會執(zhí)行if標簽中的條件。MyBatis提供了choose元素。if標簽是與(and)的關(guān)系,而choos
14、e比傲天是或(or)的關(guān)系。choose標簽是按順序判斷其內(nèi)部when標簽中的test條件出否成立,如果有一個成立,則choose結(jié)束。當(dāng)choose中所有when的條件都不滿則時,則執(zhí)行otherwise中的sql。類似于Java的switch語句,choose為switch,when為case,otherwise貝U為defaultohtmlviewplaincopy<!-滿足其中一個條件時候用choosewhen操彳-><selectid="selectByCriteria"parameterType="com.mucfc.dto.Stud
15、ent"resultMap="BaseResultMap">select*fromt_student<where><choose><whentest="stuId!=nullandstuId!='">STU_ID=#stuId</when><whentest="stuClass!=nullandstuClass!=''">andSTU_CLASS=#stuClass</when><otherwise></o
16、therwise></choose></where></select>輸入兩個參數(shù)這里會跳過王五這個參數(shù),因為stuId不為空然后看打印了來的語句,果然只有一個條件,所以說明是對的foreach對于動態(tài)SQL非常必須的,主是要迭代一個集合,通常是用于IN條件。List實例將使用“l(fā)ist”做為鍵,數(shù)組實例以“array”做為鍵。foreach元素是非常強大的,它允許你指定一個集合,聲明集合項和索引變量,它們可以用在元素體內(nèi)。它也允許你指定開放和關(guān)閉的字符串,在迭代之間放置分隔符。這個元素是很智能的,它不會偶然地附加多余的分隔符。注意:你可以傳遞一個Li
17、st實例或者數(shù)組作為參數(shù)對象傳給MyBatis。當(dāng)你這么做的時候,MyBatis會自動將它包裝在一個Map中,用名稱在作為鍵。List實例將會以“l(fā)ist”作為鍵,而數(shù)組實例將會以“array”作為鍵。foreach的主要用在構(gòu)建in條件中,它可以在SQL語句中進行迭代一個集合。foreach元素的屬性主要有item,index,collection,open,separator,close。item表示集合中每一個元素進行迭代時的別名,index指定一個名字,用于表示在迭代過程中,每次迭代到的位置,open表示該語句以什么開始,separator表示在每次進行迭代之間以什么符號作為分隔符,c
18、lose表示以什么結(jié)束,在使用foreach的時候最關(guān)鍵的也是最容易出錯的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:如果傳入的是單參數(shù)且參數(shù)類型是一個List的時候,collection屬性值為list如果傳入的是單參數(shù)且參數(shù)類型是一個array數(shù)組的時候,collection的屬性值為array如果傳入的參數(shù)是多個的時候,我們就需要把它們封裝成一個Map了,當(dāng)然單參數(shù)也可以封裝成map,實際上如果你在傳入?yún)?shù)的時候,在MyBatis里面也是會把它封裝成一個Map的,map的key就是參數(shù)名,所以這個時候collection屬
19、性值就是傳入的List或array對象在自己封裝的map里面的key下面分別來看看上述三種情況的示例代碼:1 .單參數(shù)List的類型:htmlviewplaincopy<selectid="dynamicForeachTest"resultType="Blog">select*fromt_blogwhereidin<foreachcollection="list"index="index"item="item"open="("separator="
20、,"close=")">#item</foreach></select>上述collection的值為list,對應(yīng)的Mapper是這樣的javaviewplaincopypublicList<Blog>dynamicForeachTest(List<Integer>ids);測試代碼:javaviewplaincopyTestpublicvoiddynamicForeachTest()SqlSessionsession=Util.getSqlSessionFactory().openSession();Blo
21、gMapperblogMapper=session.getMapper(BlogMapper.class);List<Integer>ids=newArrayList<Integer>();ids.add(1);ids.add(3);ids.add(6);List<Blog>blogs=blogMapper.dynamicForeachTest(ids);for(Blogblog:blogs)System.out.println(blog);session.close();2 .單參數(shù)array數(shù)組的類型:javaviewplaincopy<selec
22、tid="dynamicForeach2Test"resultType="Blog">select*fromt_whereidin<foreachcollection="array"index="index"item="item"open="("separator=","close=")">#item</foreach></select>上述collection為array,對應(yīng)的Mapper代
23、碼:javaviewplaincopypublicList<Blog>dynamicForeach2Test(intids);對應(yīng)的測試代碼:javaviewplaincopyTestpublicvoiddynamicForeach2Test()SqlSessionsession=Util.getSqlSessionFactory().openSession();BlogMapperblogMapper=session.getMapper(BlogMapper.class);intids=newint1,3,6,9;List<Blog>blogs=blogMapper.
24、dynamicForeach2Test(ids);for(Blogblog:blogs)System.out.println(blog);session.close();3 .自己把參數(shù)封裝成Map的類型javaviewplaincopy<selectid="dynamicForeach3Test"resultType="Blog">select*fromt_blogwheretitlelike"%"#title"%"andidin<foreachcollection="ids"
25、;index="index"item="item"open="("separator=","close=")">#item</foreach></select>上述collection的值為ids,是傳入的參數(shù)Map的key,對應(yīng)的Mapper代碼:javaviewplaincopypublicList<Blog>dynamicForeach3Test(Map<String,Object>params);對應(yīng)測試代碼:javaviewplai
26、ncopyTestpublicvoiddynamicForeach3Test()SqlSessionsession=Util.getSqlSessionFactory().openSession();BlogMapperblogMapper=session.getMapper(BlogMapper.class);finalList<Integer>ids=newArrayList<Integer>();ids.add(1);ids.add(2);ids.add(3);ids.add(6);ids.add(7);ids.add(9);Map<String,Objec
27、t>params=newHashMap<String,Object>();params.put("ids",ids);params.put("title","中國");List<Blog>blogs=blogMapper.dynamicForeach3Test(params);for(Blogblog:blogs)System.out.println(blog);session.close();6、聯(lián)合實例:htmlviewplaincopy<insertid="batchInsertTr
28、xBillDetailInfo"parameterType="java.util.Map">INSERTALL<foreachcollection="list"item="item">intoTRX_BILL_DETAIL_INFO<trimprefix="("suffix=")"suffixOverrides=","><iftest="item.id!=null">ID,</if><i
29、ftest="item.custNo!=null">CUST_NO,</if><iftest="item.transCode!=null">TRANS_CODE,</if><iftest="item.transRefno!=null">TRANS_REFNO,</if><iftest="item.transSeqno!=null">TRANS_SEQNO,</if><iftest="item.orderNo!=
30、null">ORDER_NO,</if><iftest="item.transAmt!=null">TRANS_AMT,</if><iftest="item.billDate!=null">BILL_DATE,</if><iftest="item.billFlag!=null">BILL_FLAG,</if><iftest="item.transDesc!=null">TRANS_DESC,</if></trim><trim
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 承包運輸 合同范本
- 商務(wù)酒店經(jīng)營管理合同范本
- 2024年物業(yè)協(xié)議解除條款樣本
- 房子維修合同范本
- 2024年酒類商業(yè)分銷協(xié)議稿
- 大米批發(fā)銷售合作協(xié)議2024年
- 2024跨國企業(yè)外籍人員勞動協(xié)議
- 2024年《師說》公開課:新時代教師培養(yǎng)
- 2024年合作伙伴權(quán)益保障協(xié)議書
- 2024年長途大型貨車租賃協(xié)議樣本
- 產(chǎn)品設(shè)計-淺談智能藍牙音響的外觀創(chuàng)新設(shè)計
- 2024屆重慶市永川區(qū)物理高一第一學(xué)期期中質(zhì)量檢測試題含解析
- 傳統(tǒng)節(jié)日文化在幼兒園課程中的應(yīng)用研究 論文
- 瀝青改色路面修補施工方案
- 香菇種植示范基地項目可行性策劃實施方案
- 混凝土硫酸鹽侵蝕基本機理研究
- 《機械設(shè)計基礎(chǔ)A》機械電子 教學(xué)大綱
- 水工巖石分級及圍巖分類
- 斜井敷設(shè)電纜措施
- 施工機械設(shè)備租賃實施方案
- 牙膏產(chǎn)品知識課件
評論
0/150
提交評論