MyBatis动态SQL

MyBatis动态SQL

在项目的开发中,编码人员经常需要根据不同的条件拼接SQL语句。在组拼SQL语句的过程中除了实现核心功能以外还需要处处小心,时时警惕确保不遗漏必要的标点符号、空格以及关键字。

动态SQL常用标签如下:

<if/>

<where/>

<choose/><when/><otherwise/>

<set/>

<trim/>

<bind/>

<foreach/>

<sql/>

<include/>

if查询案例代码

<select id="queryUserWithIf" resultType="User">
    select * from user where 1=1
    <if test="username !=null and username !='' ">
        and username=#{username}
    </if>
    <if test="password !=null and password !='' ">
        and password=#{password}
    </if>
</select>

where查询案例代码

<select id="queryUserWithWhere" resultType="User">
    select * from user
    <where>
        <if test="username !=null and username !=''">
            and username=#{username}
        </if>
        <if test="password !=null and password !=''">
            and password=#{password}
        </if>
    </where>
</select>

<choose/>、<when/>、<otherwise/>案例代码

<select id="queryUserWithChoose" resultType="User">
    select * from user
    <where>
        <choose>
            <when test="username !=null and username !=''">
                and username=#{username}
            </when>
            <when test="password !=null and password !=''">
                and password=#{password}
            </when>
            <otherwise>
                and username like concat('%','lu','%')
            </otherwise>
        </choose>
    </where>
</select>

<set>案例代码

<update id="updateUserWithSet" parameterType="User">
    update user
    <set>
        <if test="username !=null and username !=''">
            username=#{username},
        </if>
        <if test="password !=null and password !=''">
            password=#{password},
        </if>
        <if test="gender !=null and gender !=''">
            gender=#{gender}
        </if>
    </set>
    where id=#{id}
</update>

<trim/>

<trim/>标签常用于用于在SQL语句前后添加或删除一些内容。<trim/>标签常用属性及其作用如表5-1所示。

5-1 <trim/>标签属性

属性

释义

prefix

SQL语句前添加内容

prefixOverrides

删除SQL语句前多余的关键字或字符

suffix

SQL语句后添加内容

suffixOverrides

删除SQL语句后多余的关键字或字符

<trim>案例代码

<update id="updateUserWithTrim" parameterType="User">
    update user
    <trim prefix="set" suffixOverrides="and">
        username=#{username} and
    </trim>
    where id=#{id}
</update>

在映射文件中依据用户id进行更新操作。在更新语句中利用<trim/>标签的prefix属性在username前添加set关键字并利用<trim/>标签的suffixOverrides属性去掉and关键字。假如不使用<trim/>标签那么拼接后的SQL语句为update user username=#{username} and where id=#{id} 很明显,这条SQL语句是错误的。

<foreach/>

<foreach/>标签用于在SQL语句中遍历List、数组、Map等集合。除此以外,该标签用于SQL中的in查询

<foreach/>标签常见属性及其作用如表5-2所示。

5-2 < foreach />标签属性

属性

释义

collection

待遍历的集合

item

集合中被遍历的当前对象

index

当集合为List和数组时index是对象的索引。

当集合是MapindexMap的键。

open

表示开始符号,其常用值为"("

separator

表示各元素之间的分隔符,其常用值为","

close

表示结束符号,其常用值为")"

<foreach>案例代码

<!-- 测试foreach遍历List -->
<select id="queryUserWithForeach1" resultType="User">
    select * from user where id in
    <foreach collection="userIDList" open="(" separator="," close=")" item="userID">
        #{userID}
    </foreach>
</select>

<!-- 测试foreach遍历数组 -->
<select id="queryUserWithForeach2" resultType="User">
    select * from user where id in
    <foreach collection="userIDArray" index="i" item="userID" open="(" separator="," close=")" >
        #{userID}
    </foreach>
</select>

<!-- 测试foreach与Map的使用 -->
<select id="queryUserWithForeach3" resultType="User">
    select * from user where gender = #{userMap.gender} and id in
    <foreach collection="userMap.userIDList" item="userID" index="key" open="(" separator="," close=")" >
        #{userID}
    </foreach>
</select>

<sql/>

<sql/>标签用于定义可重用的SQL片段,该标签常用属性为id作为SQL片段的唯一标识。

<include/>

<include/>标签常与<sql/>标签配合使用,即使用<include/>引用已经定义的SQL片段。<include/>标签的属性refid表示引用的<sql/>标签的id值。

<sql>、<include>案例代码

 

<!-- 测试动态SQL语句include -->
<select id="queryUserWithInclude" resultType="User">
    select <include refid="columns"/> from user
    <where>
        <if test="username !=null and username !=''">
            and username=#{username}
        </if>
        <if test="password !=null and password !=''">
            and password=#{password}
        </if>
    </where>
</select>

 

posted @ 2023-10-05 21:34  荧惑守心~  阅读(13)  评论(0编辑  收藏  举报