mybatis中mapper文件中的动态sql语句

时间:2024-03-15 12:33:54
有时候在检索时,用户提供的数据不一样多,我们很难使用静态的sql语句进行判别,所以这个时候需要使用动态的sql语句
这里主要针对Mapper.xml文件中的sql语句,笔者在下面所有的例子中只提供了Mapper.xml文件中的动态sql语句
如果想要自己测试,需要自己提供Mapper中的一个接口类和一个测试方法具体查看笔者之前写过的mybatis的使用步骤,这里不做过多的介绍
另外,笔者实现建立好了一张courses表,其中id为主键,并有课程名(name),课程介绍(description),开始时间(start_date),结束时间(end_date)
下面使用的sql都是基于courses表实现的
1.if:
元素为<if>这里的意思和大多数变成语言一样if(判断条件){}如果'判定条件'为true则执行{}中的内容
同样如果<if>中的判断条件为true则 在where语句的后面增加标签里的内容语句,下面通过一个例子来具体理解
如图:
mybatis中mapper文件中的动态sql语句
2.where:
此时,我们发现<if>元素中一个非常令人讨厌的缺点,就是我们必须得提供至少一个where的限定条件
但是我们很多时候一条限定条件都不想提供(恒等的限定条件不是一个有效的方法),所以我们可以使用<where>元素
如图:
mybatis中mapper文件中的动态sql语句
通过以上代码我们可以发现,之后满足条件之后,才会在先前的sql语句之后继续添加where限定语句
而且,如果第一个条件不满足,从第二个条件开始满足时,mybites会自动帮助我们去除第二个条件语句中的"and",不会造成语法错误
3.choose:
<choose>元素是指判断众多的条件从而选择满足的唯一的一条条件,进行sql语句添加
类似于java语言中的
if(判定条件){
}else if(判定条件) {
}else {
}
如图:
mybatis中mapper文件中的动态sql语句
如果没有一条满足的话,最后添加<otherwise>元素中的内容作为sql语句
4.trim:
<trim>元素与<where>元素使用基本上相同,但是<trim>可以自己提供删除前缀,添加前缀等功能,使代码更加的灵活
如图:
mybatis中mapper文件中的动态sql语句
其中:
prefix表示有一个if成立则插入where语句
suffix表示后缀,插入到最后,与perfix正好相反
suffixOverrides="xxx"表示如果最后生成的sql语句多一个xxx,则自动去掉
prefixOverrides的意思是去掉前缀,和suffixOverrides的使用正好相反


这里如果任意一个<if>条件为true,<trim>元素会插入WHERE,并且移除紧跟where后面的(and或or)
5.foreach
<foreach>元素是一个循环语句,可以创建一连串的and或or语句 或者是一个in语句
如图:
mybatis中mapper文件中的动态sql语句
判断的条件是list中的所有集合
产生的sql语句为
select *
from courses
or tutor_id=1
or tutor_id=2
or tutor_id=3
注:tutor_id=后的数字都是取传进来参数list集合中的数据

6.set
<set>使用方法基本上与<where>使用方法相同

如图:

mybatis中mapper文件中的动态sql语句