MyBatis实现动态SQL的实现方法
MyBatis最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。
尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中使用强大的动态SQL来改进这些状况。
if元素
if元素条件判断,动态SQL最常做的事就是有条件地包括where子句。例如:
SELECT*FROMBLOGWHEREstate=‘ACTIVE' ANDtitlelike#{title}
where元素
where元素知道插入“where”如果它包含的标签中有内容返回的话。此外,如果返回的内容以“AND”或者“OR”开头,它会把“AND”或者“OR”去掉。
select*fromt_student andname=#{name} andage=#{age}
choose元素
有时候我们不想应用所有的条件,而是想从多个选项中选择一个。与java中的switch语句相似,MyBatis提供了一个choose元素。
when元素
当when里面的条件成立时,执行when标签内的语句
select*fromt_student andname=#{name} andage=#{age}
otherwise元素
当所有when都不成立了,执行otherwise
select*fromt_student andname=#{name} andage=#{age} andname='jim'
trim元素
如果where元素的行为并没有完全按您想象的那样,您还可以使用trim元素来自定义。
trim内的if有成立的就添加一个前缀用prefix=""定义,没有就不添加。
trim元素也可以去掉where后面指定的关键字and或者or等等,用prefixOverrides=""定义
select*fromt_student andname=#{name} andage=#{age}
set元素
在动态update语句里相似的解决方式叫做set,这个set元素能够动态地更新列。
set元素将动态的配置set关键字,也用来剔除追加到条件末尾的任何不相关的逗号。
updatet_student whereid=#{id} name=#{name}, age=#{age},
当然了,聪明的你肯定想知道等同的trim元素该怎么写吧,它就像这样:
updatet_student name=#{name}, age=#{age}, whereid=#{id}
注意这种情况,我们剔除了一个后缀,同时追加了一个前缀。
Foreach元素
另一个动态SQL经常使用到的功能是集合迭代,通常用在in条件句
foreach元素非常强大,允许您指定一个集合,申明能够用在元素体内的项和索引变量。也允许您指定开始和结束的字符,也可以加入一个分隔符到迭代器之间。这个元素的聪明之处在于它不会意外地追加额外的分隔符。
select*fromt_studentwhereagein #{item}
测试方法如下:
publicvoidfindStudentByAge(){ SqlSessionsqlSession=null; try{ sqlSession=MyBatisUtil.getsqlSession(); StudentDaostudentDao=sqlSession.getMapper(StudentDao.class); Listlist=newArrayList (); list.add(21); list.add(23); List liststudent=studentDao.findStudentByAge(list); System.out.println(liststudent); }catch(Exceptione){ e.printStackTrace(); } }
输出的sql结果:select*fromt_studentwhereagein(item,item),显示age为21、23的学生信息。
Settings元素
Setting元素下是些非常重要的设置选项,用于设置和改变MyBatis运行中的行为。下面的表格列出了Setting元素支持的属性、默认值及其功能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vuQc9cUw-1576746278488)(E:\javaEE笔记\img\QQ浏览器截图20191218153217.png)]
完整配置例子:
XML中的特殊字符
如果MyBatis使用XML配置,那不可避免地会遇到一些对XML来说是特殊的字符。如小于号“<”,因为XML解析器会认为是一个新元素的开始,因此要进行转义。这里有两个方法:
1使用转义实体
下面是五个在XML文档中预定义好的转义实体:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
select*fromt_studentwhereage$lt;23
2使用CDATA部件
一个CDATA部件以"“标记结束。在”"之间的特殊字符的意义都不起作用,而转变为普通字符串内容。
一般地,在MyBatis的XML映射语句配置文件中,如果SQL语句有特殊字符,那么使用CDTA部件括起来,如:
而在动态SQL各元素的测试语句中,在元素的属性中不能再嵌套其它元素或包含CDATA部件,因此只能使用转义实体,如:
select*fromauthor id=#{authorId}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。