Mybatis动态sql的用法

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元素的用法。

 

 

 

 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值