應(yīng)用場景:
有個需求势誊,需要通過狀態(tài)(status=0或1)來查詢數(shù)據(jù),status類型為Integer
```
<if test="status !=null and status!=''">
? and status = #{status}
</if>
```
當(dāng)傳入status=0時捺球,并沒有進入該條件里面缸浦;但傳入1或其他都可以根據(jù)status條件查詢夕冲;為什么呢?
通過源碼了解到裂逐,mybatis在預(yù)編譯sql時歹鱼,使用OGNL表達式來解析if標簽,對于Integer類型屬性卜高,在判斷不等于''時弥姻,例如status != '',OGNL會返回''的長度掺涛,
源碼:(s.length() == 0) ? 0.0 : Double.parseDouble( s )庭敦,
因此表達式status != ''被當(dāng)做status != 0來判斷,所以當(dāng)status=0時薪缆,if條件判斷不通過秧廉。
我們只需要將status!=''條件去掉就可以解決上面這個問題。
總結(jié):
1拣帽、盡量使用包裝類:我們知道java的基本數(shù)據(jù)類型都會有默認值疼电,如果直接使用基本數(shù)據(jù)類型會給我們的查詢帶來不必要的麻煩,所以盡量使用包裝類代替减拭。
2蔽豺、這設(shè)計數(shù)據(jù)庫時可以使用字符串類型代替int類型,這樣就避免了上述的問題
這里有詳細的源碼介紹拧粪,對源碼感興趣的小伙伴戳:https://blog.csdn.net/qq_30038111/article/details/82665763