在mybatis的mapper.xml中用以下語句判斷條件:
<if test="name='0'">? ??
and name=#{name}
</if>?
實現(xiàn),當(dāng)name傳入字符串0時,判斷name的值
但是在實際運行過程中,這個判斷條件并沒有生效。
原因:mybatis是用OGNL表達(dá)式來解析的,在OGNL的表達(dá)式中,'0'會被解析成字符,而java是強(qiáng)類型的,傳入的是一個String類型,故而?char和String比較時是不相等的。所以sql中if標(biāo)簽是不會被解析的
解決方法:
一、使用用雙引號
<if test='name="0"'>
and name=#{name}</if>
二、使用toString()
<if test="name='0'.toString()">
and name=#{name}
</if>
推薦使用第二種toString方法。
PS:mybatis中的if、when等里面的test條件判斷時,被判斷的字段可以通過調(diào)用java.util.String的方法進(jìn)行判斷,如:
<when test='fwbdh.indexOf(",") != -1'>
AND t.FWBDH in (${fwbdh})
</when>
多條件判斷標(biāo)簽choose when otherwise
choose標(biāo)簽是按順序判斷其內(nèi)部的when標(biāo)簽,當(dāng)某一個when標(biāo)簽滿足條件后,則choose標(biāo)簽結(jié)束,當(dāng)所有的when標(biāo)簽都不滿足時,則執(zhí)行最后的otherwise標(biāo)簽
<!-- choose(判斷參數(shù)) - 按順序?qū)嶓w類 User 第一個不為空的屬性作為:where條件 --> <select id="getProductList_choose" resultMap="resultMap_user" parameterType="com.entity.Product">
SELECT * FROM Product p
<where>
????<choose>
????????????<when test="name !=null ">
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p.name LIKE CONCAT(CONCAT('%', #{name, jdbcType=VARCHAR}),'%')
????????????</when >
????????????<when test="type!= null and type!= ' ' ">
? ? ? ? ? ? ? ? ? ? ? AND p.type= #{type, jdbcType=INTEGER}
????????????</when >
????????????<otherwise>
? ? ? ? ? ? ? ? ? ? AND p.price = #{price, jdbcType=NUMBER}
? ? ? ? ? ? ? ? </otherwise>
? ? ? ? ? ? </choose>
????????</where>
</select>