有时候静态SQL语句并不能很好的满足我们的业务,我们希望通过一些条件,来构建动态SQL语句
mybatis对动态SQL提供了一些:<if> <where> <trim> <choose> <when> <foreach> <set> 来实现
1、<if>块
<if test="要判断的内容">
如果条件成立SQL语句会跟上这里面的内容
</if>
<if test="salary != null">
and salary > #{salary}
</if>
2、<where>块
where 元素,会自动帮我们添加where ,并且去除where 后面的and or
例如下面的代码,如果两个条件都成立的话SQL语句是where xxx = ? and yyy > ?....
如果第一个条件不成立,SQL语句是where yyy > ?.....
<where>
<if test = "xxx">
and xxx = #{id}
</if>
<if test = "xxx">
and yyy > #{salary}
</if>
......
</where>
3、<trim>块
trim:用来裁剪字符串用的,有四个属性
prefix:自动添加前缀
prefixOverrides:把前缀后面的内容覆盖掉
suffix:自动添加后缀
suffixOverrides:把后缀前面的内容覆盖掉
insert into student
values
<trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=",">
,#{id},#{name},
</trim>
这样我们得到的sql语句就是:insert into student values(#{id},#{name})
trim自动添加()前后缀,并且把(后面的逗号移除,把)前面的逗号移除
如果希望移除多种情况,可以像这样设置:prefixOverrides=",|."
4、<choose>、<when>、<otherwise>块
有点类似于java里面的 switch case default
choose = switch
when = case
otherwise = default
如果when里面的条件满足,就不会执行后面的when块和otherwise块了
只选择一个,如果when块都不满足,会选择otherwise块
<choose>
<when test="salary > 10000 ">
xxxx1
</when>
<when test="salary > 5000">
xxxx2
</when>
<otherwise>
xxxx3
</otherwise>
</choose>
5、<set>块
<set>:只写一个,会帮我们自动剔除最后的逗号,不会处理控制的情况,不会自动加逗号
一般用在update操作中
<update id="xxx">
update employee
values
<set>
<trim prefix="(" suffix=")," suffixOverrides=",">
<if test="id != null">
id = #{id},
</if>
<if test="name != null">
name = #{name},
</if>
</trim>
</set>
<where>
eid = #{eid}
</where>
</update>
一般搭配一些逻辑一起使用。
6、<foreach>循环
collection属性值:官方说法,所有可以迭代的变量都行
Dao类方法参数类型是List:collection的值可以是:list,参数名(注解@Param声明的名字,arg0...,param1....)
Dao类方法参数类型是Map:collection的值可以是:参数名(注解@Param声明名字,arg0...,param1....),参数名.keys()或参数名.values()
注意:不能填list,map,或collection,item,和index
separator:以什么分隔
open:以什么开始
close:以什么结束
item:给遍历的元素起的别名
index:下标/索引
<update id="xxx">
insert into employee(username,salary,gender)
values
<foreach collection="empList" item="emp" open="(" separator="," close=")" index="i">
username = #{username},
salary = #{salary},
gender = #{gender}
</foreach>
</update>
这样就能生成动态的SQL语句:insert into employee(username,salary,gender) values(xxx,xxx,xxx),(xxx,xxx,xxx)
open在遍历empList时,先添加一个(,然后等里面的操作执行完成准备遍历下一个时,close会跟上一个),最后separator会补上一个逗号,当是最后一个元素时,不会补逗号