动态sql语句标签:
bind
choose
foreach
if
include
set
trim
where
where标签
需要根据条件进行判断查询,此时则需要执行动态的sql语句。
问题描述:
假如映射文件配置接口方法,需要插入一个参数为Employee对象。我们需要根据对象中的某些条件,来执行对应的sql语句。如下表为一个emploee对象的数据库字段和数据,假如我们需要查询出emploee中的字段。如果id不为空,则查询条件要加上id属性。如果姓名不为空,则查询条件需要加上姓名。如果年龄不为空,则需要叫上年龄作为条件查询。
id name age
1 zs 18
2 ls 16
3 ww 23
解决办法:显然,我们需要通过动态的拼接sql语句进行执行。
Mybatis提供了if功能,允许动态的sql功能。
<select id="方法名" resultType="">
select * from employee where
<if test="id!=null">
id=#{id} and
if>
<if test="name!=null">
name=#{name} and
if>
<if test="age!=null">
age=#{age}
if>
select>
看上述代码。通过if动态的拼接sql语句,即可按照条件执行动态的sql语句。但是我们会发现一个问题。假如第三个条件不满足,显然此时的sql语句的结尾会多一个and。这样动态的拼接sql语句显然会很麻烦。
于是,Mybatis便提供了一种方法。通过 where标签。可以帮助我们自动的截取掉多余的and。
if标签
<select id="方法名" resultType="">
select * from employee
<where>
<if test="id!=null">
and id=#{id}
if>
<if test="name!=null">
and name=#{name}
if>
<if test="age!=null">
age=#{age}
if>
where>
select>
如上述情况。当sql语句前边有多余的and时,where会帮助我们自动的截取掉多余的and。(注意,只能截取前边多余的and,不能截取后边多余的and)。
但是问题又来了。假如三种条件都不满足。那么查询的sql语句便多了一个where字段。此时需要通过另外一种方式。
trim标签
<select id="方法名" resultType="">
select * from employee where
<trim prefix="" prefixOverrides="" suffix="" suffixOverrides="">
<if test="id!=null">
and id=#{id}
if>
<if test="name!=null">
and name=#{name}
if>
<if test="age!=null">
age=#{age}
if>
trim>
select>
通过trim标签进行字符串的截取。
trim的标签
标签 | 说明 |
---|---|
prefix | (智能的添加)可以动态的添加where |
prefixOverrides | (智能的去掉)去除前边的多余的字符。可以去掉此案例中前边多余的and |
suffix | 添加一个后缀,与prefix相对 |
suffixOverrides | 去除后边多余的字符,与prefixOverrides相对 |
foreach标签
假如需要查询SQL语句:
select * from employee id IN (1,2,3,4,5。。。)
此时我们传入的参数是一个list集合(集合的元素中值为1,2,3,4,5.。。。)。显然的集合中有多少个元素我们不知道,但是需要遍历集合中所有的元素进行查询。
此时就需要用到foreach进行集合的遍历。
foreach标签
标签 | 说明 |
---|---|
item | 为每次从集合中取到的值设置一个变量名 |
index | 若集合为map类型的时候,则index表示索引下标 |
open | 表示sql语句以什么开始,即加上前缀 |
close | 与open的作用相对 |
separator | 表示每次遍历集合中的元素以什么分隔 |
choose标签
可以替代上述的if进行条件判断。其中when表示判断if。另外choose的otherwise标签可表示else的功能。
set标签
主要用于更新操作,替代set字段。与上述的where标签作用类似。
bind标签
基本不用,做模糊查询的时候使用,加入模糊查询%a%。此时可以将a通过bind标签绑定为一个变量temp,此时sql语句中,就可以通过temp表示%a%。
include标签
需要通过和sql标签配合使用。
sql标签是在select同级别下使用。可以将一个常用的sql语句,表示为一个变量。
include则在动态sql语句中,通过include标签即可导入sql标签的sql语句。
注:mybatis的动态sql中,支持静态方法,方法,构造器,运算符的使用。与java代码的操作基本大致相似。