mybatis学习(四)--动态SQL

来源:互联网 发布:c4dr16 mac注册机 编辑:程序博客网 时间:2024/06/05 10:32

动态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             <choose>            <when test="username!=null">                username=#{username}            </when>            <when test="password!=null">                password=#{password}            </when>            <otherwise>                gender=#{gender}            </otherwise>            </choose>        </select>
  • trim, where, set标签

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

    <update 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}    </update>

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

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

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

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

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

<update 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}    </update>

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

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

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