W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
前面幾個(gè)例子已經(jīng)方便地解決了一個(gè)臭名昭著的動(dòng)態(tài) SQL 問題?,F(xiàn)在回到之前的 “?if
?” 示例,這次我們將 “?state = ‘ACTIVE’
?” 設(shè)置成動(dòng)態(tài)條件,看看會(huì)發(fā)生什么。
<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>
如果沒有匹配的條件會(huì)怎么樣?最終這條 SQL 會(huì)變成這樣:
SELECT * FROM BLOG
WHERE
這會(huì)導(dǎo)致查詢失敗。如果匹配的只是第二個(gè)條件又會(huì)怎樣?這條 SQL 會(huì)是這樣:
SELECT * FROM BLOG
WHERE
AND title like ‘someTitle’
這個(gè)查詢也會(huì)失敗。這個(gè)問題不能簡(jiǎn)單地用條件元素來解決。這個(gè)問題是如此的難以解決,以至于解決過的人不會(huì)再想碰到這種問題。
MyBatis 有一個(gè)簡(jiǎn)單且適合大多數(shù)場(chǎng)景的解決辦法。而在其他場(chǎng)景中,可以對(duì)其進(jìn)行自定義以符合需求。而這,只需要一處簡(jiǎn)單的改動(dòng):
<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
?元素只會(huì)在子元素返回任何內(nèi)容的情況下才插入 “?WHERE
?” 子句。而且,若子句的開頭為 “?AND
?” 或 “?OR
?”,?where
?元素也會(huì)將它們?nèi)コ?
如果 ?where
?元素與你期望的不太一樣,你也可以通過自定義 ?trim
?元素來定制 ?where
?元素的功能。比如,和 ?where
?元素等價(jià)的自定義 ?trim
?元素為:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
?prefixOverrides
?屬性會(huì)忽略通過管道符分隔的文本序列(注意此例中的空格是必要的)。上述例子會(huì)移除所有 ?prefixOverrides
?屬性中指定的內(nèi)容,并且插入 ?prefix
?屬性中指定的內(nèi)容。
用于動(dòng)態(tài)更新語句的類似解決方案叫做 ?set
?。?set
?元素可以用于動(dòng)態(tài)包含需要更新的列,忽略其它不更新的列。比如:
<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>
這個(gè)例子中,?set
?元素會(huì)動(dòng)態(tài)地在行首插入 ?SET
?關(guān)鍵字,并會(huì)刪掉額外的逗號(hào)(這些逗號(hào)是在使用條件語句給列賦值時(shí)引入的)。
來看看與 ?set
?元素等價(jià)的自定義 ?trim
?元素吧:
<trim prefix="SET" suffixOverrides=",">
...
</trim>
注意,我們覆蓋了后綴值設(shè)置,并且自定義了前綴值。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: