@Param註解的使用
阿新 • • 發佈:2018-11-27
在使用mybatis時經常碰到這些錯誤:
org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'code' in 'class java.lang.String'; (應該是一個引數的情況下會出現) nested exception is org.apache.ibatis.binding.BindingException: Parameter 'code' not found. Available parameters are [0, 1, param1, param2];
其實都是介面的引數命名導致mybatis引數綁定出錯引起的。預設情況下mybatis把引數按順序轉化為[0, 1, param1, param2]
,也就是說#{0} 和 #{param1}
是一樣的,都是取第一個引數,以此類推。
下面經過實驗驗證,首先分兩種情況:
-
使用if判斷
如果使用了< if test="codee != null and codee !=''">
if判斷,那麼介面引數就需要加@Param
註解。使用了if判斷,mybatis取值的時候引數就成了[param1, codee]
,所以你不得不加註解@Param("codee")
,這個時候不再有0或1了(Available parameters are [param1, codee]
< if test="codee != null and codee !=''">
if判斷,那麼介面引數就需要加@Param
註解。使用了if判斷,mybatis取值的時候引數就成了[param1, codee]
,所以你不得不加註解@Param("codee")
,這個時候不再有0或1了(Available parameters are [param1, codee]
),或者param1… 也可用,比如:< if test="param1 != null and param1 !=''"> and FAULTPOSITION_CODE like CONCAT('%',CONCAT(#{param1,jdbcType=VARCHAR},'%')) ESCAPE '*' < /if>
-
沒有使用if判斷
這個時候也分兩種情況:
(1)介面引數只有一個,不管介面引數名是什麼,這個時候#{xxx}沒有限制,可以是0,param1,也可以是aaa,bbb。可以不加註解。
(2)當介面引數大於一個的時候,mybatis的引數集就是上邊說的預設值[0, 1, param1, param2]
,如果你不用預設值,就需要加上@Param
註解起別名。一旦加了註解,mybatis的引數集就和第一種情況一樣了,這個時候也就不再區分是否使用if判斷。
mybatis的詳細引數轉化可以看這個文章:https://my.oschina.net/flags/blog/381199