1. 程式人生 > >mybatis傳多個引數(不使用@param註解情況下),3.4.2版本之後使用#{0}-#{n}引起的引數繫結異常,以及settings屬性中useActualParamName的作用。

mybatis傳多個引數(不使用@param註解情況下),3.4.2版本之後使用#{0}-#{n}引起的引數繫結異常,以及settings屬性中useActualParamName的作用。

解決方案:

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));