




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、 mybatis動態(tài)sql語句分類: mybatis2011-04-13 13:34 7889人閱讀 評論(2) 收藏 舉報sqlnulllistxmlstringjava目錄(?)+三、動態(tài)sql語句 有些時候,sql語句where條件中,需要一些安全判斷,例如按性別檢索,如果傳入的參數(shù)是空的,此時查詢出的結(jié)果很可能是空的,也許我們需要參數(shù)為空時,是查出全部的信息。這是我們可以使用動態(tài)sql,增加一個判斷,當(dāng)參數(shù)不符合要求的時候,我們可以不去判斷此查詢條件。 下文均采用mysql語法和函數(shù)(例如字符串鏈接函數(shù)concat)。 源代碼/
2、admin/blogs/782190頁面最下面; 3.1 if標(biāo)簽 一個很普通的查詢:xml代碼 1 2 3 select * from student_tbl st 4 where st.student_name like concat(concat(%, #studentname),%) 5 xml view plaincopy6 7 8 select * from student_tbl st 9 where st.student_name like concat(concat(%, #studentname),%) 10 但是此時如果studentname是null或空字符串,此語句很
3、可能報錯或查詢結(jié)果為空。此時我們使用if動態(tài)sql語句先進(jìn)行判斷,如果值為null或等于空字符串,我們就不進(jìn)行此條件的判斷。修改為:xml代碼 11 12 13 select * from student_tbl st 14 15 where st.student_name like concat(concat(%, #studentname),%) 16 17 xml view plaincopy18 19 20 select * from student_tbl st 21 22 where st.student_name like concat(concat(%, #studentnam
4、e),%) 23 24 此時,當(dāng)studentname的值為null或的時候,我們并不進(jìn)行where條件的判斷,所以當(dāng)studentname值為null或值,不附帶這個條件,所以查詢結(jié)果是全部。 由于參數(shù)是java的實體類,所以我們可以把所有條件都附加上,使用時比較靈活, new一個這樣的實體類,我們需要限制那個條件,只需要附上相應(yīng)的值就會where這個條件,相反不去賦值就可以不在where中判斷。 代碼中的where標(biāo)簽,請參考3.2.1.xml代碼 25 26 27 select * from student_tbl st 28 29 30 st.student_name like con
5、cat(concat(%, #studentname),%) 31 32 33 and st.student_sex = #studentsex 34 35 36 and st.student_birthday = #studentbirthday 37 38 39 and st.class_id = #classentity.classid 40 41 42 xml view plaincopy43 44 45 select * from student_tbl st 46 47 48 st.student_name like concat(concat(%, #studentname),%
6、) 49 50 51 and st.student_sex = #studentsex 52 53 54 and st.student_birthday = #studentbirthday 55 56 57 and st.class_id = #classentity.classid 58 59 60 查詢,姓名中有李,男,生日在1985-05-28,班級在20000002的學(xué)生。 java代碼 61 studententity entity = new studententity(); 62 entity.setstudentname(李); 63 entity.setstudentsex
7、(男); 64 entity.setstudentbirthday(stringutil.parse(1985-05-28); 65 entity.setclassentity(classmapper.getclassbyid(20000002); 66 list studentlist = studentmapper.getstudentlistwhereentity(entity); 67 for( studententity entitytemp : studentlist) 68 system.out.println(entitytemp.tostring(); 69 java vie
8、w plaincopy70 studententity entity = new studententity(); 71 entity.setstudentname(李); 72 entity.setstudentsex(男); 73 entity.setstudentbirthday(stringutil.parse(1985-05-28); 74 entity.setclassentity(classmapper.getclassbyid(20000002); 75 list studentlist = studentmapper.getstudentlistwhereentity(ent
9、ity); 76 for( studententity entitytemp : studentlist) 77 system.out.println(entitytemp.tostring(); 78 3.2 where、set、trim標(biāo)簽3.2.1 where當(dāng)if標(biāo)簽較多時,這樣的組合可能會導(dǎo)致錯誤。例如,like姓名,等于指定性別等:xml代碼 79 80 81 select * from student_tbl st 82 where 83 84 st.student_name like concat(concat(%, #studentname),%) 85 86 87 and
10、st.student_sex = #studentsex 88 89 xml view plaincopy90 91 92 select * from student_tbl st 93 where 94 95 st.student_name like concat(concat(%, #studentname),%) 96 97 98 and st.student_sex = #studentsex 99 100 如果上面例子,參數(shù)studentname為null或,則或?qū)е麓藄ql組合成“where and”之類的關(guān)鍵字多余的錯誤sql。 這時我們可以使用where動態(tài)語句來解決。這個“w
11、here”標(biāo)簽會知道如果它包含的標(biāo)簽中有返回值的話,它就插入一個where。此外,如果標(biāo)簽返回的內(nèi)容是以and 或or 開頭的,則它會剔除掉。 上面例子修改為:xml代碼 101 102 103 select * from student_tbl st 104 105 106 st.student_name like concat(concat(%, #studentname),%) 107 108 109 and st.student_sex = #studentsex 110 111 112 xml view plaincopy113 114 115 select * from stude
12、nt_tbl st 116 117 118 st.student_name like concat(concat(%, #studentname),%) 119 120 121 and st.student_sex = #studentsex 122 123 124 3.2.2 set當(dāng)在update語句中使用if標(biāo)簽時,如果前面的if沒有執(zhí)行,則或?qū)е露禾柖嘤噱e誤。使用set標(biāo)簽可以將動態(tài)的配置set 關(guān)鍵字,和剔除追加到條件末尾的任何不相關(guān)的逗號。沒有使用if標(biāo)簽時,如果有一個參數(shù)為null,都會導(dǎo)致錯誤,如下示例:xml代碼 125 126 127 update student_tbl
13、128 set student_tbl.student_name = #studentname, 129 student_tbl.student_sex = #studentsex, 130 student_tbl.student_birthday = #studentbirthday, 131 student_tbl.class_id = #classentity.classid 132 where student_tbl.student_id = #studentid; 133 xml view plaincopy134 135 136 update student_tbl 137 set
14、 student_tbl.student_name = #studentname, 138 student_tbl.student_sex = #studentsex, 139 student_tbl.student_birthday = #studentbirthday, 140 student_tbl.class_id = #classentity.classid 141 where student_tbl.student_id = #studentid; 142 使用set+if標(biāo)簽修改后,如果某項為null則不進(jìn)行更新,而是保持?jǐn)?shù)據(jù)庫原值。如下示例:xml代碼 143 144 145
15、update student_tbl 146 147 148 student_tbl.student_name = #studentname, 149 150 151 student_tbl.student_sex = #studentsex, 152 153 154 student_tbl.student_birthday = #studentbirthday, 155 156 157 student_tbl.class_id = #classentity.classid 158 159 160 where student_tbl.student_id = #studentid; 161 x
16、ml view plaincopy162 163 164 update student_tbl 165 166 167 student_tbl.student_name = #studentname, 168 169 170 student_tbl.student_sex = #studentsex, 171 172 173 student_tbl.student_birthday = #studentbirthday, 174 175 176 student_tbl.class_id = #classentity.classid 177 178 179 where student_tbl.s
17、tudent_id = #studentid; 180 3.2.3 trim trim是更靈活的去處多余關(guān)鍵字的標(biāo)簽,他可以實踐where和set的效果。 where例子的等效trim語句:xml代碼 181 182 183 select * from student_tbl st 184 185 186 st.student_name like concat(concat(%, #studentname),%) 187 188 189 and st.student_sex = #studentsex 190 191 192 xml view plaincopy193 194 195 sele
18、ct * from student_tbl st 196 197 198 st.student_name like concat(concat(%, #studentname),%) 199 200 201 and st.student_sex = #studentsex 202 203 204 set例子的等效trim語句:xml代碼 205 206 207 update student_tbl 208 209 210 student_tbl.student_name = #studentname, 211 212 213 student_tbl.student_sex = #student
19、sex, 214 215 216 student_tbl.student_birthday = #studentbirthday, 217 218 219 student_tbl.class_id = #classentity.classid 220 221 222 where student_tbl.student_id = #studentid; 223 xml view plaincopy224 225 226 update student_tbl 227 228 229 student_tbl.student_name = #studentname, 230 231 232 stude
20、nt_tbl.student_sex = #studentsex, 233 234 235 student_tbl.student_birthday = #studentbirthday, 236 237 238 student_tbl.class_id = #classentity.classid 239 240 241 where student_tbl.student_id = #studentid; 242 3.3 choose (when, otherwise) 有時候我們并不想應(yīng)用所有的條件,而只是想從多個選項中選擇一個。mybatis提供了choose 元素,按順序判斷when中
21、的條件出否成立,如果有一個成立,則choose結(jié)束。當(dāng)choose中所有when的條件都不滿則時,則執(zhí)行otherwise中的sql。類似于java 的switch 語句,choose為switch,when為case,otherwise則為default。 if是與(and)的關(guān)系,而choose是或(or)的關(guān)系。 例如下面例子,同樣把所有可以限制的條件都寫上,方面使用。選擇條件順序,when標(biāo)簽的從上到下的書寫順序:xml代碼 243 244 245 select * from student_tbl st 246 247 248 249 st.student_name like con
22、cat(concat(%, #studentname),%) 250 251 252 and st.student_sex = #studentsex 253 254 255 and st.student_birthday = #studentbirthday 256 257 258 and st.class_id = #classentity.classid 259 260 261 262 263 264 265 xml view plaincopy266 267 268 select * from student_tbl st 269 270 271 272 st.student_name
23、 like concat(concat(%, #studentname),%) 273 274 275 and st.student_sex = #studentsex 276 277 278 and st.student_birthday = #studentbirthday 279 280 281 and st.class_id = #classentity.classid 282 283 284 285 286 287 288 3.4 foreach對于動態(tài)sql 非常必須的,主是要迭代一個集合,通常是用于in 條件。list 實例將使用“l(fā)ist”做為鍵,數(shù)組實例以“array” 做為
24、鍵。 3.4.1參數(shù)為list實例的寫法:sql寫法:xml代碼 289 290 select * from student_tbl st 291 where st.class_id in 292 293 #classlist 294 295 xml view plaincopy296 297 select * from student_tbl st 298 where st.class_id in 299 300 #classlist 301 302 接口的方法聲明:java代碼 303 public list getstudentlistbyclassids(list classlist)
25、; java view plaincopy304 public list getstudentlistbyclassids(list classlist); 測試代碼,查詢學(xué)生中,在20000002、20000003這兩個班級的學(xué)生:java代碼 305 list classlist = new arraylist(); 306 classlist.add(20000002); 307 classlist.add(20000003); 308 309 list studentlist = studentmapper.getstudentlistbyclassids(classlist); 31
26、0 for( studententity entitytemp : studentlist) 311 system.out.println(entitytemp.tostring(); 312 java view plaincopy313 list classlist = new arraylist(); 314 classlist.add(20000002); 315 classlist.add(20000003); 316 317 list studentlist = studentmapper.getstudentlistbyclassids(classlist); 318 for( s
27、tudententity entitytemp : studentlist) 319 system.out.println(entitytemp.tostring(); 320 3.4.2參數(shù)為array實例的寫法: sql語句:xml代碼 321 322 select * from student_tbl st 323 where st.class_id in 324 325 #ids 326 327 xml view plaincopy328 329 select * from student_tbl st 330 where st.class_id in 331 332 #ids 333 334 接口的方法聲明:java代碼 335 public list getstudentlistbyclassids(string ids); java view plaincopy336 public list getstudentlistbyclassids(string ids); 測試代碼,查詢學(xué)生中,在20000002、20000003這兩個班級的學(xué)生:java代碼 337 string ids = new string2; 338 ids0 = 20000002; 339 ids1 = 20000003; 340 list studentlist = studentmap
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 天津舞臺噴泉施工方案
- 建筑施工方案分類
- 調(diào)料品稅務(wù)知識培訓(xùn)課件
- 合同范例 購銷合同
- 合肥搬家合同范例
- 只有金額合同范例
- 買賣他人按揭房合同范例
- 特殊學(xué)生支持與幫助方案計劃
- 強(qiáng)化數(shù)據(jù)保護(hù)與隱私管理計劃
- 全院綜合評估與自查報告計劃
- 建筑工程混凝土運輸方案
- 國殤屈原課件生字詞
- 2024社區(qū)工作者勞動合同
- 呼吸治療師進(jìn)修匯報
- 老舊小區(qū)電梯更新改造方案
- 課件香港地理教學(xué)課件
- 2023年輔導(dǎo)員職業(yè)技能大賽試題及答案
- 2023年天津銀行招聘筆試真題
- 工程質(zhì)量控制流程圖
- 現(xiàn)代家政導(dǎo)論-課件 1.2.2認(rèn)識現(xiàn)代家政的特點和功能
- 日語翻譯崗位招聘面試題與參考回答2025年
評論
0/150
提交評論