問題場景
需求如下:需要根據傳入的單個字符串進行判斷
select * <if test="type == '1'"> from user a </if> <if test="type == '2'"> from app-user a </if>
在此時物料type傳遞"1"還是"2",這個<if>都不會生效,還會報錯。
原因分析
是mybatis是用OGNL表達式來解析的,在OGNL的表達式中,'1'或'2'這種類的都會被解析成字符,而java又是強類型的,字符和單個字符串是不相等的,故會導致兩邊的類型不等,因此<if>標簽中的sql不會被解析。要想相等,必須兩邊都是相同的類型。
解決方案
解決方法有三種,分別如下:
1)將單引號換為雙引號
把test的引號換成單引號,里面的判斷換成雙引號即可。
select * <if test='type == "1"'> from user a </if> <if test='type == "2"'> from app-user a </if>
2)使用toString強轉
把字符類型使用toString()方法強轉為字符串類型
select * <if test="type == '1'.toString()"> from user a </if> <if test="type == '2'.toString()"> from app-user a </if>
3)將字符換成Integer類型
在傳遞參數時就傳遞Integer類型,使用Integer類型進行判斷
select * <if test="type == 1"> from user a </if> <if test="type == 2"> from app-user a </if>
推薦使用第一種或第三種方式。