1.为什么要用动态sql
在我的上一篇博客中,我简单的介绍了Mybatis映射器的用法,从中我们会发现,那些sql语句相对来说都比较简单,应用场景也不是很复杂,但是我们在做具体的业务和功能时,所用到的sql查询语句往往时很复杂的,拿最常见的淘宝网举例,用户输入的关键字不同,就会出现不同的商品,而我们在写程序时也不能让用户固定的去选哪几个参数,所以怎么才能满足这种复杂的业务需求呢,这时候,就出现了我们的动态sql。
2.什么时动态sql
动态sql简单来说就是可以根据不同的条件,拼接出不同的sql语句,可以实现对数据库更准确的操作,从而实现更复杂的业务场景。
3.常用的动态sql元素
①if元素
如上图所示,if元素的作用就是可以根据用户传入的参数来动态的拼接sql语句条件,如果用户传入了对应的参数,if元素就会把这些条件拼接起来,这里要注意if的语法。
②choose元素
choose的用法如上图所示,仔细观察一下就会发现,这种语法结构和java中的switch case结构比较相似,choose就相当于是java中的switch,when就相当于switch结构中的case,而otherwise就相当于finally。既然如此相似,所以我们的choose元素也有switch的一些特征:
a.不管有几个when标签里面的条件满足,它只会拼接第一个满足条件的sql语句,假如用户传入了所有的查询参数,但是它只会拼接上第一个,如图只会按照sname来查询
b.如果前面when标签里面的条案件都不满足,他就会拼接otherwise标签中的语句,就相当于switch结构中的fianlly
③where元素
看到这个标签的时候,我第一时间就会联想到sql语句中的where关键字。具体用法如下图所示
仔细观察一个where的用法,其实就是把if标签中的where变成了where标签,我在if的代码中在sql语句后面加上了where 1=1这个条件,这样写的原因就是if标签中的and关键字,if标签只会将满足条件的sql语句拼接到后面,它不会帮我们来处理这个where,所以我加了一个恒成立的条件,来使我们的sql语句不报错,但是有了where标签,就变得简单很多,where标签会直接将相应的and加上或者去除。所以我们在写查询条件时,一般都会用where标签替换sql语句中的where关键字。
④set元素
看到这个元素的时候,我第一时间就会想到sql语句中的set关键字,下面来看一下他的用法
如图所示,我们在写修改语句的时候,每个修改条件后面到必须要跟上 逗号,而这个逗号放到我们的动态sql语句中,就显得比较难处理,这时候就要用到我们的set标签,他的功能和where关键字比较类似,where关键字可以帮我们加上或者去掉多的and,而set标签则可以帮们去挑最后一个判断条件的逗号。
⑤trim元素
这个标签中首先要明白四个参数:
a.prefix=" a" ----在语句开头加上a b.prefixOverrides =" a"---在开头去掉a
c.suffix ="a" ----在语句结尾加上a d.suffixOverrdies ="a" ----在语句结尾去掉a
如上图所示,可以利用trim标签来实现动态修改,可以达到和上面修改一样的结果。
⑥foreach元素
foreach的作用就相当于是我们java中的for循环,他就是我们动态sql中的for循环,要了解foreach元素,我们先来了解一下foreach中的五个参数:
a.collection 传入的参数是集合后面跟list,传入的是数组后面跟array
b.item 每个元素的存放起一个变量名
c.open 语句开始添加一个
d. close 语句艺术添加一个
e. separator 每个元素的分隔符
了解这几个参数之后,我们就可以利用foreach来实现范围查询
如上图所示,代码比较简单,最终得到的sul语句如下下图所示:可以和上面的语句做一个对比,就可以很清晰的指导foreach的用法。
⑦bind元素
我们在sql语句查询时经常会遇到模糊查询,而在动态sql中对于模糊查询,处理的办法有很多,下面就来简单介绍一下以下几种查询方法:
a.这种方法就是让用户那边传入的参数符合模糊查询的写法 例如传入:李%
b.这种方法是让用户那边传入正常的参数,但是可以在sql语句中处理,用到concat关键字,来对参数和%进行拼接
c.把下面这两种方法放在一起对比着看,写法都很类似,也可以实现相应的功能,但是他们之间的区别是:${}相当于是字符串的替换,它不能方式sql注入,而#{} 可以防止sql注入
d.利用bind元素,bind元素本来的功能是定义变量,但是在这可以用来实现模糊查询
以上就是常见的动态sql元素的用法。