动态SQL简介
动态SQL是Mybatis框架中强大特性之一。在一些组合查询页面,需要根据用户输入的查询条件生成不同的查询SQL,这在JDBC或其他相似框架中需要在代码中拼写SQL,经常容易出错,在Mybatis框架中可以解决这种问题。
使用动态SQL元素与JSTL相似,它允许我们在XML中构建不同的SQL语句。常用元素为:
判断元素:if,choose
关键字元素:where,set,trim
循环元素:foreach
if元素
if元素是简单的条件判断逻辑,满足指定条件时追加if元素内的SQL,不满足条件时不追加。格式为:
<select....>
SQL语句1
<if test = "条件表达式">
SQL语句2
</if>
</select>
if元素最常见的使用是在where字句部分,根据不同情况追加不同的SQL条件。示例为:
<select id = "findByDeptNo" parameterType = "Emp" resultType = "Emp">
select * from Emp
<if test = "deptno != null">
where DEPTNO = #{deptno}
</if>
</select>
choose元素
choose元素的作用就相当于java中的switch语句,基本上跟JSTL中的choose作用和用法是一样的,通常与when和otherwise搭配使用。格式为:
<select ..>
SQL语句1
<choose>
<when test = "条件表达式">
SQL语句2
</when>
<otherwise>
SQL语句3
</otherwise>
</choose>
</select>
choose元素的使用示例为:
<select id = "findBySal" resultType = "Emp" parameterType = "Emp">
select * from Emp where
<choose>
<when test = "sal>2000">
SAL>=#{sal}
</when>
<otherwise>
SAL>=2000
</otherwise>
</choose>
</select>
where元素
where元素主要用于简化查询语句中where部分的条件判断。where元素可以在<where>元素所在位置输出一个where关键字,而且还可以将后面条件多余的and或or关键字去除。格式为:
<select..>
select 字段 from 表
<where>
动态追加条件
</where>
</select>
where元素的代码示例为:
<select id = "findByCondition" resultType = "Emp" parameterType = "Emp">
select * from Emp
<where>
<if test = "deptno != null">
DEPTNO = #{deptno}
</if>
<choose>
<when test = "sal>2000">
and SAL >= #{sal}
</when>
<otherwise>
and SAL >= 2000
</otherwise>
</choose>
</where>
</select>
set元素
set元素主要是用在更新操作的时候,他的主要功能和where元素相似,主要是在<set>元素所在位置输出一个set关键字,而且还可以去除内容结尾中无关的逗号。有了set元素可以动态的更新那些修改了的字段。使用格式为:
<update...>
update表
<set>
动态追加更新字段
</set>
</update>
set元素代码示例为:
<update id = "updateEmp" parameterType = "Emp">
update Emp
<set>
<if test = "ename != null">
SAL = #{sal}
</if>
<if test = "comm != null">
COMM = #{comm}
</if>
<if test = "deptno != null">
DEPTNO = #{deptno}
</if>
</set>
where EMPNO = #{empno}
</update>
trim元素
trim元素主要功能为:
可以在自己包含的内容前加上某些前缀,也可以在其后加上某些后缀,与之对应的属性是prefix和suffix;
可以把包含内容的首部某些内容过滤,即忽略。也可以把尾部的某些内容过滤,对应的属性是prefixOverrides和suffixOverrides;
正因为trim有这些功能,所以我们可以非常简单的利用trim代替where和set元素功能。
trim元素应用示例为:
<!-- 等价于where元素 -->
<trim prefix = "WHERE" prefixOverrides = "AND | OR">
....
</trim>
<!-- 等价于set元素 -->
<trim prefix = "SET" suffixOverrides = ",">
...
</trim>
foreach元素
foreach元素实现了循环逻辑,可以进行一个集合的迭代。主要用于在构建in条件中,foreach使用示例为:
<select ..>
select字段 from 表 where 字段 in
<foreach collection = "集合" item = "迭代变量" open = "(" separator = "," close = ")">
#{迭代变量}
</foreach>
</select>
foreach元素非常强大,它允许指定一个集合,声明集合项和索引变量,这些变量可以用在元素体内。它也允许指定开放和关闭的字符串,在迭代之间放置分隔符。
foreach元素代码示例为:
<select id = "findByDeptNos" resultyType = "Emp" parameterType = "Emp">
select * from Emp
<if test = "deptnos != null">
where DEPTNO in
<foreach collection = "deptnos" item = "dno" open = "(" close = ")" separator = ",">
#{dno}
</foreach>
</if>
</select>