在mybatis的mapper.xml中用以下語句判斷條件:
<if test="name='0'">? ??
and name=#{name}
</if>?
實現(xiàn)忘古,當name傳入字符串0時盆耽,判斷name的值
但是在實際運行過程中,這個判斷條件并沒有生效枚粘。
原因:mybatis是用OGNL表達式來解析的涩拙,在OGNL的表達式中,'0'會被解析成字符丧慈,而java是強類型的析命,傳入的是一個String類型主卫,故而?char和String比較時是不相等的。所以sql中if標簽是不會被解析的
解決方法:
一鹃愤、使用用雙引號
<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的方法進行判斷,如:
<when test='fwbdh.indexOf(",") != -1'>
AND t.FWBDH in (${fwbdh})
</when>
多條件判斷標簽choose when otherwise
choose標簽是按順序判斷其內(nèi)部的when標簽凹耙,當某一個when標簽滿足條件后姿现,則choose標簽結(jié)束,當所有的when標簽都不滿足時肖抱,則執(zhí)行最后的otherwise標簽
<!-- 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>