mybatis傳多個引數(不使用@param註解情況下),3.4.2版本之後使用#{0}-#{n}引起的引數繫結異常,以及settings屬性中useActualParamName的作用。
阿新 • • 發佈:2019-01-09
解決方案:
mybatis的xml配置檔案中宣告settings屬性的useActualParamName引數值為false
<setting name="useActualParamName" value="false" />
程式碼展示:
Dao層函式
User getUserBys(int id,String name);
對應的mapping.xml
<select id="getUserBys" resultType="model.User">
select * from user where id = #{0} and name=#{1}
</select >
這種方法應該是對的,但是如果你使用的是mybatis3.4.2或者之後的版本,就會產生繫結異常:
org.apache.ibatis.binding.BindingException: Parameter '0' not found. Available parameters are [arg1, arg0, param1, param2]
從異常可以看出在沒有使用@param註解的情況下,傳遞引數需要使用
#{arg0}-#{argn}或者#{param1}-#{paramn}
- 更換下mapping.xml中的程式碼
<select id="getUserBys" resultType="model.User">
select * from user where id = #{arg0} and name=#{arg1}
</select>
此時程式碼就會正常執行
下面貼上3.4.1以及之前版本的繫結異常資訊:
org.apache.ibatis.binding.BindingException: Parameter 'arg0' not found. Available parameters are [0, 1, param1, param2]
可以發現3.4.1版本中傳遞引數可以使用#{0}-#{n}
問題原因
mybatis通過XMLConfigBuilder類來載入配置檔案中的各項引數
- 3.4.2版本之前settings屬性中useActualParamName引數的預設值為flase
XMLConfigBuilder.class的settingsElement方法中的原始碼
configuration.setUseActualParamName(booleanValueOf(props.getProperty("useActualParamName"), true));
- 3.4.2版本之後settings屬性中useActualParamName引數的預設值為true
XMLConfigBuilder.class的settingsElement方法中的原始碼
configuration.setUseActualParamName(booleanValueOf(props.getProperty("useActualParamName"), false));