首頁 > 軟體

Mybatis中<if>和<choose>的區別及「=」判斷方式

2022-06-06 18:00:33

<if>和<choose>的區別及“=”判斷

在專案中xml檔案經常會遇到在判斷等於某個值時加什麼條件不等於某個值的時候加什麼條件

比如下面這個例子:

<if  test=" name != null">
    AND T.NAME = #{NAME,jdbcType=VARCHAR}
</if>
<if  test=" name  == null">
    ORDER BY NAME,ID
</if>

正確很好的寫法需要引入<choose>標籤

 <choose>
       <when test=" name != null">
          AND T.NAME = #{NAME,jdbcType=VARCHAR}
      </when>
     <otherwise>
        ORDER BY T.PRODUCT_TYPE_CODE, T.SORT DESC, T.CREATE_TIME
     </otherwise>
</choose>

第一種錯誤寫法導致的結果就是不會去做任何判斷即使name不為空。

為什麼只能用<choose>標籤,原始碼還沒有研究,或者我這個例子本身就有問題現在記錄下來,在後續的更新中我會再次總結一下這個問題。

<!--錯誤的寫法-->

<if test="newsImage != null and newsImage == 'y'">  
    <![CDATA[ and len(newsImage) > 0 ]]>  
</if>  
<!-- 正確的,穩定,推薦使用 -->  
<if test="newsImage != null and newsImage == 'y'.toString()">  
    <![CDATA[ and len(newsImage) > 0 ]]>  
</if>  

判斷 newsImage == 'y' 時,有人認為成功,但實際上是不成功的,需要改為  newsImage == 'y'.toString()方可成功,

原因具體沒有細入研究,根據實際使用推測應該是 “等於” 在java中是個比較複雜問題,涉及的“等於”有可能是變數地址相等,或者是變數值內容相等,在XML檔案中簡單的 == 在經過MyBatis處理後無法判斷是哪種型別的“相等”,所以加.toString()做強制轉換操作,MyBatis就知道是值內容的比較,當然就成功了;

注意這個常數不限於數位,對於字母,如 'y' 同樣需要加上 .toString()方可成功。

Mybatis選擇choose和條件if用法

choose用法

        <choose>
            <when test="showType == 1">
                IFNULL(k.fname,'未知') as pro_name,
            </when>
            <when test="showType == 2">
                IFNULL(e.fname,'未知') as business_name,
            </when>
            <when test="showType == 3">
                IFNULL(f.fname,'未知') as area_name,
            </when>
            <when test="showType == 4">
                IFNULL(h.fname,'未知') as sale_name,
            </when>
            <otherwise>
                IFNULL(j.F_PJQD_XMDJ,'未知') as project_type,
            </otherwise>
        </choose>

if用法

        <if test="businessName != null and businessName != ''">
            and e.fname = #{businessName}
        </if>
        <if test="areaName != null and areaName != ''">
            and f.fname = #{areaName}
        </if>

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。 


IT145.com E-mail:sddin#qq.com