使用中踩到的坑記錄一下(大神請略過,我隻是個菜菜,忽噴!!!萬分感謝!!!)
<mapper namespace="dynamic">
<resultMap id="userMap" type="com.soft.test.model.User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="create_date" property="createDate"/>
</resultMap>
<!--***if 标簽使用類似html的C标簽的if 在此處應該是and 或者使用or來代替&&和||*** -->
<select id="selectUseIf" parameterType="com.soft.test.model.User" resultMap="userMap">
select * from t_user where
<if test="id != null and id != ''">
id=#{id}
</if>
<if test="username != null and username != ''">
and username like concat('%',#{username},'%')
</if>
<if test="password != null and password != ''">
and password=#{password}
</if>
</select>
</mapper>
在上方代碼中可以看到要注意的點在于要使用and來代替" && "和用or來代替 " || "
mybatis的if判斷語句其實跟el表達式的if條件判斷有些類似。
例如:
1 如果參數為數字類型的時候沒有特俗需求的情況隻需要判斷是否為null即可。
例如:
如果有特俗需求,例如判斷是否大于某個數的時候才行。隻需要加上對應的條件判斷即可
例如:
mybatis對于這種大于小于等等還有另一種形式。
例如:
對應關系:
gt 對應 >
gte 對應 >=
lt 對應 <(會報錯 相關聯的 "test" 屬性值不能包含 '<' 字元)
lte 對應 <=(會報錯 相關聯的 "test" 屬性值不能包含 '<' 字元)
2 如果為字元串類型
2.1 如果不需要過濾空串的情況 僅僅判斷null即可
例如:
2.2 如果需要過濾空串,添加空串判斷即可 不支援 && 是以這裡用 and or || 來做邏輯與或的判斷
例如: 或者
2.3 如果判斷字元串是否已某個特俗字元開頭,結尾等。直接調用String的對應方法即可
例如:
2.4 是否是某個特定字元串,某些業務有此需要。
例如: 或者
注意:
這種形式的寫法在參數類型是字元串的時候是沒有問題的,
但是參數類型為非字元串類型的時候就需要寫成
僅僅寫成也會有很大可能會挂。
也許你會說非字元串的為什麼要寫成這樣。這就要看特俗需要了。
例如:某一個sql片段是公用的,
該片段更新條件也用,但是當你需要将某一個字段更新成null的時候怎麼辦。
這個時候就可以通過傳入一個特定的字元串來弄。當傳入的字元串為特定字元串的時候就更新該字元串為null。
xxx=null
當然這樣子貌似date型會挂。
通過 2.2 也可以看出mybatis對于字元串的相等不相等的判斷也是有對應的特俗操作符的。
eq 對應 ==
neq 對應 !=
當然還可以看出來if的條件判斷test是支援對象自身方法調用的,即使是自己寫的方法,可以自己嘗試。當然下面會有例子。
例如:裡面可以用‘xxxx’.equals(xxxx) 字元串的比較兩個字元串方法
xxxx.indexOf('ss') 判斷字元串裡面是否包含某個字元等等
3 判斷list是否為空
上面說過,if條件判斷可以直接調用對象自身的方法進行邏輯判斷,是以list判空。可以調用.size()>0或者.isEmpty()
例如: ,
4 map參數同同理 取值的話 map.key(map中的key名字)即可
此文摘要:特别鳴謝sumlen