Mybatis动态SQL

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>

 

你可能感兴趣的:(mybatis)