mybatis学习(四)--动态SQL

动态SQL是mybatis最重要的特性,它可以彻底解决jdbc那样的拼接条件的痛苦。可以使用以下标签:
•if
•choose (when, otherwise)
•trim (where, set)
•foreach

  • if 标签

    eg : 需求:根据username查询,如果gender不等于null,同时也根据gender查询。

    <select id="getUsers" resultType="user">
        select * from user
        where username = #{username}
        <if test="gender!= null">
        and gender = #{gender}
        if>
    select>
  • choose, when, otherwise标签

有时候,我们并不希望是有许多条件,我们仅希望以某一种条件进行查询,我们就可以像java的jstl标签一样。

<select id="getUsersChoose" resultType="user">
            select * from user
            where 
            
            <when test="username!=null">
                username=#{username}
            when>
            <when test="password!=null">
                password=#{password}
            when>
            
                gender=#{gender}
            
            
        select>
  • trim, where, set标签

    以上的两类标签在使用的时候,会出现一些问题,比如使用if标签更新User,动态如下

    id="updateUser" parameterType="user">
        update user set
        <if test="username!= null">
        username=#{username}
        if>
        <if test="password!= null">
         ,password=#{password}
        if>
        <if test="gender!= null">
        ,gender=#{gender} 
        if>
        where id = #{id}
    

如果username=null,其他都不是null,这样在mybatis生成动态sql的时候就会是这样;

update user set , password=#{password},gender=#{gender} where id = #{id}

有没有注意到set关键字后面多了一个“,”,这样就拼成了一个错误的sql语句。
我们可以使用trim标签对以上sql进行改造,

    id="updateUser" parameterType="user">
        update user set
        ",">
            <if test="username!= null">
            username=#{username}
            if>
            <if test="password!= null">
             ,password=#{password}
            if>
            <if test="gender!= null">
            ,gender=#{gender} 
            if>
        
            where id = #{id}
    

其中:prefixOverrides属性可以将多出的“,”忽略。
也可以直接使用set标签改造,如下

id="updateUser" parameterType="user">
        update user
        <set>
            <if test="username!= null">
            username=#{username}
            if>
            <if test="password!= null">
             ,password=#{password}
            if>
            <if test="gender!= null">
            ,gender=#{gender} 
            if>
        set>
            where id = #{id}
    

where标签也有类似的功能,它可以代替sql中的关键字where,并将拼接后的sql中多余的 “,”,或者“and”忽略,此处就不做介绍了。

  • foreach标签
    另一个很必要的操作集合动态SQL的标签是foreach。
    因为mysql数据库支持values(),(),()的sql语法,当批量插入的时候可以使用如下sql。
"addUsers" parameterType="list">
        insert into user(username,password,gender)
        values
        <foreach collection="list" item="user" separator=",">
            (#{user.username},#{user.password},#{user.gender})
        foreach>

此处仅介绍各个标签常用的方法,更多用法请参考官方提供的pdf文件。

你可能感兴趣的:(mybatis)