Mybatis框架之动态SQL书写方式小结

时间:2022-10-11 05:11:07

动态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>