Mybatis动态SQL的实现依靠的几个标签:if、(choose,when,otherwise)、foreach、where、set、trim。
1、if
示例:
<if test=" 判断条件 ">
执行的语句
</if>
若满足test中的条件,则被if包裹的语句才能执行。
SELECT
*
FROM
student
<if test="studentName != null and studentName != ''">
WHERE
student_name = #{studentName}
</if>
若studentName不为null,并且不为空字符串,则执行WHERE语句。
2、choose、when、otherwise
示例:
<choose>
<when test="判断条件1">
执行的语句1
</when>
<when test="判断条件2">
执行的语句2
</when>
......
<otherwise>
执行语句
</otherwise>
</choose>
when标签可以有1个或多个,otherwise标签可以有0个或1个。若满足when标签中的判断条件,则执行对应的语句,执行完毕后退出choose标签。若所有when标签中的判断条件都不满足则执行otherwise中的语句。(有点类似于java中带break的switch、case、default语句)
3、foreach
示例:
<foreach collection="需要循环的集合" item="变量名" open="整个循环内容开头的字符串" separator="每次循环的分隔符"
index="索引的属性名" close="整个循环体结束的字符串">
#{变量名}
</foreach>
其中collection为必填,index不常用。该标签与JSTL中的c:forEach十分相似。
SELECT
*
FROM
student
WHERE
age IN
<foreach collection="ageList" index="index" item="age" open="(" separator="," close=")">
#{age}
</foreach>
foreach标签循环完毕后为(age1,age2,age3,.....)
4、where&set
示例:
SELECT
*
FROM
student
<where>
<if test="age != null and age != ''">
age = #{age}
</if>
<if test="name != null and name != ''">
AND name = #{name}
</if>
</where>
若将where标签替换成关键字“WHERE”,并且age为空,而name不为空也不为空字符串时,例中SQL语句则会变成 "..... WHERE AND name = #{name}",此时是会出现SQL语法错误的。
而where标签会帮你将开头或者末尾的AND及OR删除,并且在只有一个以上的if条件满足时,才会插入“WHERE”语句。
示例:
UPDATE
student
<set>
<if test="name != null and name != ''">
name = #{name},
</if>
<if test="age != null and age != ''">
age = #{age}
</if>
</set>
若将set标签替换成关键字“SET”,并且name不为空也不为空字符串,而age为空时,例中SQL语句则会变成 "...... SET name = #{name},",多出一个逗号,会出现SQL语法错误。
set标签的作用与where大同小异,where标签是删除AND及OR,而set标签是删除“,”,并且只有在一个以上的if条件满足时,才会插入“SET”语句。
5、trim
示例:
<trim prefix="前缀" prefixOverrides="前缀匹配" suffix="后缀" suffixOverrides="后缀匹配">
...内容...
</trim>
prefix是在内容前添加“前缀”,prefixOverrides是匹配内容的开头,若符合匹配,则删除“前缀匹配”。suffix是在内容后添加“后缀”,suffixOverrides是匹配内容的末尾,若符合匹配,则删除“后缀匹配”。
INSERT INTO
student
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="age != null and age != ''">
age,
</if>
<if test="name != null and name != ''">
name,
</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="age != null and age != ''">
#{age},
</if>
<if test="name != null and name != ''">
#{name},
</if>
</trim>