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

实验内容

针对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>

猜你喜欢

转载自blog.csdn.net/gongm24/article/details/81022047
今日推荐