美文网首页Mybatis实验室
MyBatis入门实验(六)之动态SQL语句

MyBatis入门实验(六)之动态SQL语句

作者: 学好该死的程序 | 来源:发表于2018-07-12 21:00 被阅读1次

    实验内容

    针对Mysql的动态SQL标签 if / choose / when / otherwize / where / set / foreach / bind 分别进行设置,熟悉每一个标签的使用方法

    if

    很好理解,不做过多解释,需要注意的是并没有配套的else。

    第一个条件设置为1=1,是为了防止当所有条件都不满足时,SQL语句会变成SELECT * FROM user WHERE,而导致执行出错

    <select id="listUserWithIf" parameterType="tutorial.mybatis.model.User" resultType="tutorial.mybatis.model.User">
        SELECT * FROM `user` WHERE 1=1
        <if test="id != null">
            AND id = #{id}
        </if>
        <if test="usrename != null and username != ''">
            AND username = #{username}
        </if>
    </select>
    

    choose / when / otherwize

    上文提到没有else与if配套,那么需要使用else的时候该怎么办?choose / when / otherwize 正是处理这种情况

    <select id="listUserWithChoose" parameterType="tutorial.mybatis.model.User" resultType="tutorial.mybatis.model.User">
        SELECT * FROM `user` WHERE 1=1
        <choose>
            <when test="id != null">
                AND id = #{id}
            </when>
            <otherwise>
                AND username = #{username}
            </otherwise>
        </choose>
    </select>
    

    where

    在if标签的示例中,第一个条件设置为1=1虽然可以解决SQL语句出错的问题,但是写一个没有用的语句在SQL里始终有点难看,尤其是有代码洁癖的同学,完全不能忍受。

    下面代码与if标签的示例不同的地方是将 where 1=1 修改成了 <where> 标签,这时不管是传递ID还是传递username,SQL语句都不会出错。

    where 标签会判断有if条件成立的情况下才会插入“WHERE”子句。而且,若最后的内容是“AND”或“OR”开头的,where 元素也知道如何将他们去除。

    <select id="listUserWithWhere" parameterType="tutorial.mybatis.model.User" resultType="tutorial.mybatis.model.User">
        SELECT * FROM `user`
        <where>
            <if test="id != null">
                AND id = #{id}
            </if>
            <if test="usrename != null and username != ''">
                AND username = #{username}
            </if>
        </where>
    </select>
    

    set

    与 where 标签同样的情况,在 update 语句中的 set 块,要实现动态化,也可以使用 set 标签来进行处理

    <update id="updateWithSet" parameterType="tutorial.mybatis.model.User">
        UPDATE `user`
        <set>
            <if test="username != null">
                `username` = #{username},
            </if>
            <if test="password != null">
                `password` = #{password},
            </if>
        </set>
        where id = #{id}
    </update>
    

    foreach

    对集合进行轮询,通常在 in 条件时使用

    <select id="listUserWithForeach" resultType="tutorial.mybatis.model.User">
        SELECT * FROM `user` where username in
        <foreach collection="array" item="username" open="(" close=")" separator=",">
            #{username}
        </foreach>
    </select>
    

    bind

    定义变量

    <select id="listUserWithBind" resultType="tutorial.mybatis.model.User">
        SELECT * FROM `user`
        <where>
            <if test="username != null and username != ''">
                <bind name="usernamePattern" value="'%' + username + '%'" />
                AND username like #{usernamePattern}
            </if>
        </where>
    </select>
    

    相关文章

      网友评论

        本文标题:MyBatis入门实验(六)之动态SQL语句

        本文链接:https://www.haomeiwen.com/subject/kwxdpftx.html