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