一、什么是动态sql
1.动态 SQL 是 MyBatis 的强大特性之一。在 JDBC 或其它类似的框架中,开发人员通常需要手动拼接 SQL 语句。根据不同的条件拼接 SQL 语句是一件极其痛苦的工作。例如,拼接时要确保添加了必要的空格,还要注意去掉列表最后一个列名的逗号。而动态 SQL 恰好解决了这一问题,可以根据场景动态的构建查询。
2.动态SQL:code that is executed dynamically。 它一般是根据用户输入或外部条件动态组合的SQL语句块。 动态SQL能灵活的发挥SQL强大的功能、方便的解决一些其它方法难以解决的问题。 相信使用过动态SQL的人都能体会到它带来的便利,然而动态SQL有时候在执行性能 (效率)上面不如静态SQL,而且使用不恰当,往往会在安全方面存在隐患 (SQL 注入式攻击)。
1.动态sql是做什么的
Mybatis 动态 sql 可以让我们在 Xml 映射文件内,以标签的形式编写动态 sql,完成逻辑判断和动态拼接 sql 的功能。
二、动态sql标签
元素 | 作用 | 备注 |
if | 判断语句 | 单条件分支判断 |
choose(when、otherwise) | 相当于 Java 中的 switch case 语句 | 多条件分支判断 |
trim,where | 辅助元素 | 用于处理一些SQL拼装问题 |
foreach | 循环语句 | 在in语句等列举条件常用 |
bind | 辅助元素 | 拼接参数 |
set | 辅助元素 | 用于修改的sql语句 |
1.if标签:条件判断
if标签就类似java中的if判断,是MyBatis中常用的标签,使用if标签可以省略掉拼接sql的过程,直接在XML文件内进行
(1)不使用if判断
(2)使用if判断
如上的sql语句,如果id为空,那么查询结果就是空。这时候就可以用if判断来解决
这里可以跟where标签搭配使用,在where标签里写if标签,有多个条件那就多加几个if即可
如上sql语句,如果id为空的话,那么这条sql语句就只会执行这一句select * from emp,后面的and条件就会因为判断条件不通过而不执行。这里如果是正常写的话,where后面直接就是empId=#{id}。也不用担心这个if判断里面的and,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。
2.set标签
set标签用于修改,同样也能与if标签搭配使用,这里不做过多叙述
3.choose(when,otherwise) 标签
有时候不想用所有的查询条件,只想用单个条件去查询,这时候就可以使用choose标签,此标签就类似于else if
总的来说,就是根据你这些判断条件的顺序去执行。
如果name不为空,那么就会执行select * from users where userName=? 的sql语句,就没有后续了
如果name为空,就会继续往下判断,如果pass也为空的话,when(类似else if)标签的两条判断就结束了
接下来执行otherwise(类似最后的else)标签,这条判断是如果前面的条件都不满足,最后就会执行此判断
4.foreach标签
- foreach是用来对集合的遍历,这个和Java中的功能很类似。通常处理SQL中的in语句。
- foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符
- 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素,open是循环开始时在开头加上‘(’,close时循环结束时加上‘)’。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。
5.测试类
批量删除这里是使用的数组,也可以换成list集合去写,效果都一样