mybatis动态SQL语句_第1页
mybatis动态SQL语句_第2页
mybatis动态SQL语句_第3页
mybatis动态SQL语句_第4页
mybatis动态SQL语句_第5页
已阅读5页,还剩54页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 mybatis动态sql语句分类: mybatis2011-04-13 13:34 7889人阅读 评论(2) 收藏 举报sqlnulllistxmlstringjava目录(?)+三、动态sql语句 有些时候,sql语句where条件中,需要一些安全判断,例如按性别检索,如果传入的参数是空的,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。这是我们可以使用动态sql,增加一个判断,当参数不符合要求的时候,我们可以不去判断此查询条件。 下文均采用mysql语法和函数(例如字符串链接函数concat)。 源代码/

2、admin/blogs/782190页面最下面; 3.1 if标签 一个很普通的查询: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、可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断。修改为: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 此时,当studentname的值为null或的时候,我们并不进行where条件的判断,所以当studentname值为null或值,不附带这个条件,所以查询结果是全部。 由于参数是java的实体类,所以我们可以把所有条件都附加上,使用时比较灵活, new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断。 代码中的where标签,请参考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的学生。 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标签3.2.1 where当if标签较多时,这样的组合可能会导致错误。例如,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 如果上面例子,参数studentname为null或,则或导致此sql组合成“where and”之类的关键字多余的错误sql。 这时我们可以使用where动态语句来解决。这个“w

11、here”标签会知道如果它包含的标签中有返回值的话,它就插入一个where。此外,如果标签返回的内容是以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当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置set 关键字,和剔除追加到条件末尾的任何不相关的逗号。没有使用if标签时,如果有一个参数为null,都会导致错误,如下示例: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标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例: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是更灵活的去处多余关键字的标签,他可以实践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) 有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。mybatis提供了choose 元素,按顺序判断when中

21、的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于java 的switch 语句,choose为switch,when为case,otherwise则为default。 if是与(and)的关系,而choose是或(or)的关系。 例如下面例子,同样把所有可以限制的条件都写上,方面使用。选择条件顺序,when标签的从上到下的书写顺序: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对于动态sql 非常必须的,主是要迭代一个集合,通常是用于in 条件。list 实例将使用“list”做为键,数组实例以“array” 做为

24、键。 3.4.1参数为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); 测试代码,查询学生中,在20000002、20000003这两个班级的学生: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参数为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); 测试代码,查询学生中,在20000002、20000003这两个班级的学生: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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论