1. 程式人生 > >MyBatis中if,where,set標簽

MyBatis中if,where,set標簽

bio 我們 from 內容 email 而且 pri result 條件

<if>標簽

<select id="findActiveBlogWithTitleLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  WHERE state = ‘ACTIVE’ 
  <if test="title != null">
    AND title like #{title}
  </if>
</select>

if標簽通常伴隨著where,set出現。當增加查詢條件的時候有下面的代碼

<select id="findActiveBlogLike"
     resultType
="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE’ <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </select>

但是當state屬性也需要動態表示的時候則變成

<select id="findActiveBlogLike"
resultType="Blog"> SELECT * FROM BLOG WHERE <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name}
</if> </select>

此時會出現當state為null時,sql語句會變為 select * from BLOG WHERE AND...解決此問題則引入<where><set>等標簽.

<where>標簽

<select id="findActiveBlogLike"
     resultType="Blog">
  SELECT * FROM BLOG 
  <where> 
    <if test="state != null">
         state = #{state}
    </if> 
    <if test="title != null">
        AND title like #{title}
    </if>
    <if test="author != null and author.name != null">
        AND author_name like #{author.name}
    </if>
  </where>
</select>

where 元素知道只有在一個以上的if條件有值的情況下才去插入“WHERE”子句。而且,若最後的內容是“AND”或“OR”開頭的,where 元素也知道如何將他們去除。

如果 where 元素沒有按正常套路出牌,我們還是可以通過自定義 trim 元素來定制我們想要的功能。比如,和 where 元素等價的自定義 trim 元素為:

 
<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ... 
</trim>

同理當需要更新數據時使用<set>標簽

<update id="updateAuthorIfNecessary">
  update Author
    <set>
      <if test="username != null">username=#{username},</if>
      <if test="password != null">password=#{password},</if>
      <if test="email != null">email=#{email},</if>
      <if test="bio != null">bio=#{bio}</if>
    </set>
  where id=#{id}
</update>

MyBatis中if,where,set標簽