1. 程式人生 > >MyBatis多個接口參數報錯:Available parameters are [0, 1, param1, param2], 及解決方法

MyBatis多個接口參數報錯:Available parameters are [0, 1, param1, param2], 及解決方法

pan 解決 而且 crm ger int mybatis 添加 為什麽

1. sql語句如下: 

      SELECT * FROM tb_crm_user WHERE
id = #{userId, jdbcType=INTEGER} AND
user_name = #{userName, jdbcType=VARCHAR}

2. 接口如下:

TbCrmUser queryTbCrmUser(int userId, String userName);

3. 調用接口方式如下:

int userId = 1000059081;
String userName = "積極";
TbCrmUser user1 = tb.queryTbCrmUser(userId, userName);


4. 結果如下:

技術分享

5. 錯誤原因:

這個錯誤表示,xml可用的參數只有【0, 1, param1, param2】四個,沒有userId! 這就奇了個怪,本寶明明給了參數userId,為什麽識別不了?而且我只有一個參數的時候,這樣明明沒有錯呀!!!

原來是【0, 1, param1, param2】是MyBatis根據參數位置自定義的名字,如果只有一個參數,那就只有一個位置,當然沒有歧義了。可是如果有多個參數,就需要指定哪個參數在哪個位置!

6. 修改方式1:

最簡單的一個方式就是修改sql語句,指定位置,用0,1 或者param1, param2都可以:

SELECT * FROM tb_crm_user WHERE

id = #{0, jdbcType=INTEGER} AND
user_name = #{1, jdbcType=VARCHAR}
但是不建議這樣做,因為如果參數很多,效果則不理想;

修改方式2:
給接口添加@Param註解,指明參數的對應關系,原因是給參數配置了@Param註解後,MyBatis就會自動將參數封裝成Map類型,@Param註解值會作為Map中的key,因此在xml中的sql語句就可以通過配置的註解值來使用參數
TbCrmUser queryTbCrmUser(@Param("userId") int userId,
@Param("userName") String userName);

修改方式3:
當參數很多時:我們還可以采用如下方式解決:
首先,修改接口參數格式:
TbCrmUser queryTbCrmUser(Map<String, Object> map);

其次,在調用接口的前面自己創建一個map
int userId = 1000059081;
String userName = "積極";
Map<String, Object> map = new HashMap<>();
map.put("userId", userId);
map.put("userName", userName);
TbCrmUser user1 = tb.queryTbCrmUser(map);
這樣做的本質與第二種方式本質一致!




MyBatis多個接口參數報錯:Available parameters are [0, 1, param1, param2], 及解決方法