实验内容
针对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>
网友评论