Mybatis 標籤

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

若是這些條件沒有一個能匹配上將會怎樣?最終這條 SQL 會變成這樣:yii

SELECT * FROM BLOG
WHERE

這會致使查詢失敗。若是僅僅第二個條件匹配又會怎樣?這條 SQL 最終會是這樣:ide

SELECT * FROM BLOG
WHERE 
AND title like ‘yiibai.com’

這個查詢也會失敗。這個問題不能簡單的用條件句式來解決,若是你也曾經被迫這樣寫過,那麼你極可能今後之後都不想再這樣去寫了。spa

MyBatis 有一個簡單的處理,這在90%的狀況下都會有用。而在不能使用的地方,你能夠自定義處理方式來令其正常工做。一處簡單的修改就能獲得想要的效果:code

<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 元素也知道如何將他們去除。blog

若是 where 元素沒有按正常套路出牌,咱們仍是能夠經過自定義 trim 元素來定製咱們想要的功能。好比,和 where 元素等價的自定義 trim 元素爲:it

<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim>
相關文章
相關標籤/搜索