MyBatis框架(三)之动态sql的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fightingXia/article/details/82528033

##概述

MyBatis框架之所以优秀,一是因为将sql与代码分离,二就是具有强大的动态sql功能。

主要的动态sql有:

  1. if标签的使用。
  2. where标签的使用。
  3. where标签与choose标签的联合使用。
  4. set标签的使用。
  5. foreach标签的使用。
  6. trim标签的使用。

一,if标签的使用

使用示例如下:

    <select id="queryList" parameterType="studentModel" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from student
        WHERE name=#{name} 
        <if test="age > 0">
            AND age=#{age}
        </if>
    </select>

说明:

  1. if的作用是判断是否满足条件,满足条件时if里面的sql片段才生效。
  2. 此时的意思是:如果age大于0则在where中添加age的判断条件。

 

二,where标签的使用

使用示例如下:

    <select id="queryList" parameterType="studentModel" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from student
        <where>
            <if test="name!=null and name.length()>0">
                AND name=#{name}
            </if>
            <if test="age > 0">
                AND age=#{age}
            </if>
        </where>
    </select>

说明:

  1. where常与if连用,当if中有满足的条件时where才会其作用。
  2. where标签中的每一个字段前都可以加and,系统会自己将第一个满足条件的字段前and去掉。

注:此时的示例与上面if的示例都是动态判断where条件,二者有什么区别呢?只使用if标签时必须有一个满足判断条件的字段,使用where标签时可以全部都不满足判断条件。

三,where标签与choose标签联合的使用

where标签除了与if标签联合使用外,还可以与choose标签联合使用。使用示例如下:

    <select id="queryList" parameterType="studentModel" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from student
        <where>
            <choose>
                <when test="name!=null and name.length()>0">
                    AND name=#{name}
                </when>
                <when test="age > 0">
                    AND age=#{age}
                </when>
                <otherwise>
 
                </otherwise>
            </choose>
        </where>
    </select>

where标签与choose标签连用比与if标签联用的优点是:当都不满足条件时可以在otherwise标签中设置默认的判断条件。

四,set标签的使用

在update操作时使用动态set。使用示例如下:

    <update id="update" parameterType="studentModel">
        UPDATE student
        <set>
            <if test="name!=null and name.length()>0">
                name= #{name},
            </if>
            <if test="age>0">
                age = #{age},
            </if>
        </set>
        WHERE id = #{id}
    </update>

说明:

  1. set标签常用if标签一起使用。
  2. 每个if中的sql片段都要加逗号,这也是sql语法的要求。

 

五,foreach标签的使用

foreach的意思是遍历,使用示例如下:

    <select id="getObjectByIds" parameterType="java.util.List" resultType="studentModel">
        select name,age
        from student
        where id in
        <foreach collection="list" index="index" item="item" separator="," open="(" close=")">
            #{item}
        </foreach>
    </select>

说明:

  1. collection :collection属性的值有三个分别是list、array、map三种,分别对应的参数类型为:List、数组、map集合,我在上面传的参数为集合,所以值为list.
  2. item : 表示在迭代过程中每一个元素的别名
  3. index :表示在迭代过程中每次迭代到的位置(下标)
  4. open :前缀
  5. close :后缀
  6. separator :分隔符,表示迭代时每个元素之间以什么分隔.

六,trim标签的使用

trim是一个很灵活的标签,有四个属性,意思分别是:

1、prefix,suffix 表示在trim标签包裹的部分的前面或者后面添加内容。

2、prefixOverrides,suffixOverrides 表示前面或者后面删除内容。

3、如果suffixOverrides和suffix同时使用,则一般现写suffixOverrides,再写suffix,表示先删除suffixOverrides的属性值,然后再拼接suffix中的属性值。

具体使用示例如下:

    <update id="testTrim" parameterType="com.mybatis.pojo.User">
        update user
        <trim prefix="set" suffixOverrides=",">
            <if test="cash!=null and cash.length()>0">
                cash= #{cash},
            </if>
            <if test="address!=null and address.length()>0">
                address= #{address},
            </if>
        </trim>
        where id = #{id}
    </update>

此时把set拼接在cash=#{cash}前。并把address=#{address}后面的逗号删除。

上面的例子也可以这么写:

    <update id="testTrim" parameterType="com.mybatis.pojo.User">
        update user
        set
        <trim suffixOverrides="," suffix="where id = #{id}">
            <if test="cash!=null and cash.length()>0">
                cash= #{cash},
            </if>
            <if test="address!=null and address.length()>0">
                address= #{address},
            </if>
        </trim>
        where id = #{id}
    </update>

##总结

目前常用的动态sql标签就是这些,以后会持续更新。

猜你喜欢

转载自blog.csdn.net/fightingXia/article/details/82528033