![MyBatis Parameter ‘list‘ not found. Available parameters are [cars, param1] 錯誤詳解](http://pic.xiahunao.cn/yaotu/MyBatis Parameter ‘list‘ not found. Available parameters are [cars, param1] 錯誤詳解)
MyBatisParameter ‘list‘ not found. Available parameters are [cars, param1]錯誤詳解一、錯誤現(xiàn)象運行測試時拋出異常org.apache.ibatis.binding.BindingException: Parameter list not found. Available parameters are [cars, param1]錯誤位置在com.xie.mapper.CarMapper.insertMore方法。二、錯誤含義這個錯誤表明MyBatis 在解析 XML 中的foreach標簽時試圖從參數(shù)中獲取名為list的值但實際傳入的參數(shù)中只有cars和param1兩個可用參數(shù)不存在list這個名稱。錯誤信息中的Available parameters are [cars, param1]明確告訴你當前方法可用的參數(shù)名是cars和param1但你用了list。三、根本原因分析3.1 代碼示例錯誤情況你的 Mapper 接口中可能定義了這樣的方法publicinterfaceCarMapper{// ? 錯誤使用了 Param(cars)但 XML 中用了 collectionlistintinsertMore(Param(cars)ListCarcarList);}對應的 XML 映射中使用了foreach標簽insertidinsertMoreINSERT INTO t_car (car_num, brand, guide_price, produce_time, car_type) VALUESforeachcollectionlistitemcarseparator,(#{car.carNum}, #{car.brand}, #{car.guidePrice}, #{car.produceTime}, #{car.carType})/foreach/insert測試代碼Testpublicvoidtest6(){ListCarcarListArrays.asList(newCar(京A11111,寶馬,30.0,2024-01-01,燃油車),newCar(京A22222,奔馳,45.0,2024-01-02,燃油車));// ? 調(diào)用時傳入的是 carListcarMapper.insertMore(carList);}3.2 執(zhí)行流程方法參數(shù)上有Param(cars)MyBatis 將參數(shù)放入 Map 時Key 為cars同時也會用param1作為備用 Key。XML 中collectionlistMyBatis 去 Map 中查找 Key 為list的值找不到。拋出Parameter list not found異常并提示可用參數(shù)為[cars, param1]。四、解決方案方案一修改 XML 中的collection屬性推薦將collection改為Param注解的值insertidinsertMoreINSERT INTO t_car (car_num, brand, guide_price, produce_time, car_type) VALUES!-- ? 將 list 改為 cars與 Param(cars) 一致 --foreachcollectioncarsitemcarseparator,(#{car.carNum}, #{car.brand}, #{car.guidePrice}, #{car.produceTime}, #{car.carType})/foreach/insert方案二去掉Param注解使用默認名稱// 去掉 Param 注解intinsertMore(ListCarcarList);此時 MyBatis 會使用list作為默認 KeyXML 中可以繼續(xù)使用collectionlist。foreachcollectionlistitemcarseparator,方案三使用param1作為 collection!-- 不推薦可讀性差 --foreachcollectionparam1itemcarseparator,五、參數(shù)命名規(guī)則速查表場景方法簽名XML 中可用的collection值有Param(xxx)int insert(Param(cars) ListCar list);cars推薦無ParamListint insert(ListCar list);list無ParamArrayint insert(Long[] ids);array無ParamSetint insert(SetLong ids);collection使用Param 默認int insert(Param(cars) ListCar list);param1不推薦六、常見易錯點總結(jié)1. ?Param注解名與collection不一致Param(cars)ListCarcarListforeachcollectionlist!-- 錯誤應該用 cars --2. ? 誤用默認名稱Param(cars)ListCarcarListforeachcollectioncars!-- 正確 --3. ? 無Param時用了自定義名稱ListCarinsertBatch(ListCarcarList);// 無 ParamforeachcollectioncarList!-- 錯誤應該用 list --4. ? 推薦做法intinsertMore(Param(cars)ListCarcarList);foreachcollectioncarsitemcarseparator,七、修正后的完整代碼7.1 Mapper 接口publicinterfaceCarMapper{/** * 批量插入車輛 * param carList 車輛列表 * return 插入條數(shù) */intinsertMore(Param(cars)ListCarcarList);}7.2 XML 映射insertidinsertMoreINSERT INTO t_car (car_num, brand, guide_price, produce_time, car_type) VALUESforeachcollectioncarsitemcarseparator,(#{car.carNum}, #{car.brand}, #{car.guidePrice}, #{car.produceTime}, #{car.carType})/foreach/insert7.3 測試代碼Testpublicvoidtest6(){ListCarcarListArrays.asList(newCar(京A11111,寶馬,30.0,2024-01-01,燃油車),newCar(京A22222,奔馳,45.0,2024-01-02,燃油車),newCar(京A33333,奧迪,35.0,2024-01-03,燃油車));introwscarMapper.insertMore(carList);System.out.println(插入條數(shù)rows);sqlSession.commit();}八、錯誤排查流程圖┌─────────────────────────────────────────────────────────────────┐ │ BindingException: Parameter xxx not found │ │ Available parameters are [a, b, param1, ...] │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Step 1: 查看 XML 中 foreach 的 collection 屬性值 │ │ 當前值list │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Step 2: 查看 Mapper 接口方法的 Param 注解 │ │ 當前Param(cars) │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Step 3: 對比 collection 值與 Param 值 │ │ list ≠ cars → 不一致 │ └─────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 解決方案統(tǒng)一 collection 與 Param 名稱 │ │ 方案Acollectioncars推薦 │ │ 方案B去掉 Param使用 list │ └─────────────────────────────────────────────────────────────────┘九、總結(jié)速查表錯誤信息根本原因解決方案Parameter list not found. Available parameters are [cars, param1]XML 中collectionlist但方法參數(shù)使用了Param(cars)將collection改為carsParameter xxx not found. Available parameters are [list, param1]使用了自定義名稱但方法無Param用list或加ParamReturn value (3) was not iterable傳入單個值但 XML 用了foreach改用或傳入集合結(jié)語Parameter xxx not found錯誤是 MyBatis 中參數(shù)綁定最常見的問題之一。核心原則是XML 中collection屬性的值必須與方法參數(shù)或Param注解的名稱保持一致。記住兩條黃金法則如果方法參數(shù)有Param(xxx)XML 中用collectionxxx。如果方法參數(shù)沒有Param對于List使用list對于Array使用array。養(yǎng)成使用Param注解并保持命名一致的習慣可以避免 90% 以上的參數(shù)綁定問題。