解決異常-nested exception is org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found

今天自己在擼代碼的時候一時手誤,出現了異常,異常信息是:

 

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'roleIdList' not found. Available parameters are [0, 1, param1, param2]
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:371)
    at com.sun.proxy.$Proxy14.insert(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:240)
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:51)

 

大概的意思是Mybatis在運行的時候發生了系統異常,此處嵌套了一個參數綁定異常。我們往下看控制檯打印的日誌會

如下圖:

 接着我們找到Cause by 這個關鍵詞後會發現一下信息:

 

可以看到上面提示 roleIdList這個參數沒有找到,可用的參數對象是[0, 1, param1, param2],很顯然這個問題是我們在Mapper接口中聲明方法的時候有多個參數,但是沒有使用@Param註解。

於是我們找到Mapper接口中對應的方法,發現真的忘了加@Param註解

 好了,現在我們加上@Param註解即可。

這裏解釋一下@Param註解的作用,當我們的sql中需要多個參數的時候,Maybatis會將參數列表中的參數封裝成一個Map進行傳遞,這個過程是通過@Param來實現的,@Param註解括號中的值會作爲key,value就是參數實際的值。解析參數的時候會按照@Param中定義的key獲取對應的值。如上圖中所示,MyBatis在運行的時候會將adminId和roleIdList兩個參數封裝成一個Map,

正確的語法是void insertNewAdminRelationship(@Param("adminId") Integer adminId, @Param("roleIdList") List<Integer> roleIdList);

這樣MyBayis傳遞的是就是一個{"adminId":adminId,"roleIdList":roleIdList}的形式,當sql運行的時候取值的方式就是通過get("roleIdList")來獲取值的。

好了,原理就是這麼簡單,希望對大家有幫助。下次有空的話把這部分的源碼和大家分析一遍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章