MyBatis choose(when, otherwise)標(biāo)簽

有時候我們并不想應(yīng)用所有的條件,而只是想從多個選項中選擇一個。而使用if標(biāo)簽時,只要test中的表達(dá)式為 true,就會執(zhí)行 if 標(biāo)簽中的條件。MyBatis 提供了 choose 元素。if標(biāo)簽是與(and)的關(guān)系,而 choose 是或(or)的關(guān)系。

choose標(biāo)簽是按順序判斷其內(nèi)部when標(biāo)簽中的test條件出否成立,如果有一個成立,則 choose 結(jié)束。當(dāng) choose 中所有 when 的條件都不滿則時,則執(zhí)行 otherwise 中的sql。類似于Java 的 switch 語句,choose 為 switch,when 為 case,otherwise 則為 default。

例如下面例子,同樣把所有可以限制的條件都寫上,方面使用。choose會從上到下選擇一個when標(biāo)簽的test為true的sql執(zhí)行。安全考慮,我們使用where將choose包起來,放置關(guān)鍵字多于錯誤。

<!--  choose(判斷參數(shù)) - 按順序?qū)嶓w類 User 第一個不為空的屬性作為:where條件 -->  
<select id="getUserList_choose" resultMap="resultMap_user" parameterType="com.yiibai.pojo.User">  
    SELECT *  
      FROM User u   
    <where>  
        <choose>  
            <when test="username !=null ">  
                u.username LIKE CONCAT(CONCAT('%', #{username, jdbcType=VARCHAR}),'%')  
            </when >  
            <when test="sex != null and sex != '' ">  
                AND u.sex = #{sex, jdbcType=INTEGER}  
            </when >  
            <when test="birthday != null ">  
                AND u.birthday = #{birthday, jdbcType=DATE}  
            </when >  
            <otherwise>  
            </otherwise>  
        </choose>  
    </where>    
</select>  

choose (when,otherwize) ,相當(dāng)于java 語言中的 switch ,與 jstl 中 的 choose 很類似。

<select id="dynamicChooseTest" parameterType="Blog" resultType="Blog">
        select * from t_blog where 1 = 1 
        <choose>
            <when test="title != null">
                and title = #{title}
            </when>
            <when test="content != null">
                and content = #{content}
            </when>
            <otherwise>
                and owner = "owner1"
            </otherwise>
        </choose>
    </select>

when元素表示當(dāng) when 中的條件滿足的時候就輸出其中的內(nèi)容,跟 JAVA 中的 switch 效果差不多的是按照條件的順序,當(dāng) when 中有條件滿足的時候,就會跳出 choose,即所有的 when 和 otherwise 條件中,只有一個會輸出,當(dāng)所有的我很條件都不滿足的時候就輸出 otherwise 中的內(nèi)容。所以上述語句的意思非常簡單, 當(dāng) title!=null 的時候就輸出 and titlte = #{title},不再往下判斷條件,當(dāng)title為空且 content!=null 的時候就輸出 and content = #{content},當(dāng)所有條件都不滿足的時候就輸出 otherwise 中的內(nèi)容。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • MySql動態(tài)語句 if, set, where , choose, foreach, trim MyBatis的...
    一只阿木木閱讀 1,227評論 0 1
  • 溫馨提示:本文閱讀需要8分鐘,建議收藏后閱讀! EL表達(dá)式很厲害對不對 今天我們來一個更厲害的JSTL “為什么說...
    Java聯(lián)盟閱讀 1,331評論 0 1
  • 回首頁 第一部分 Drupal簡介 Drupal overview A tour of Drupal fundam...
    王乂閱讀 2,222評論 0 9
  • 今日所學(xué):《如何有效閱讀一本書:超實用讀書筆記法》[日] 奧野宣之 一、三星式篩選法 一星通讀,二星重讀,三星定位...
    磐石yy閱讀 166評論 0 0

友情鏈接更多精彩內(nèi)容