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