1. 复现错误
今天写好批量删除接口,如下代码所示:
/**
* 批量删除
* @param map{ids}
* @return R
*/
@Operation(summary = "批量删除", description = "批量删除")
@SysLog("批量删除")
@DeleteMapping("/ids")
@PreAuthorize("@pms.hasPermission('archsys_sysRecordTypeCorresponding_delete')")
public R deleteByIds(@RequestBody Map<String, Object> map) {
List<Long> ids = (List<Long>) map.get("ids");
return R.ok(sysRecordTypeCorrespondingService.deleteByIds(ids));
}
/**
* 通过id批量删除
* @param ids
* @return
*/
@Override
public Boolean deleteByIds(List<Long> ids) {
return sysRecordTypeCorrespondingMapper.deleteById(ids);
}
/**
* 通过id批量删除
* @param ids
* @return
*/
Boolean deleteById(@Param("ids") List<Long> ids);
<delete id="deleteById" >
DELETE FROM sys_recordtypecorresponding
WHERE id IN
<foreach collection="ids" item="item" index="index" open="(" close=")" separator=",">
#{item}
</foreach>
</delete>
启动项目,使用postman
测试,却报出如下错误:
2. 解决错误
nested exception is org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [ids, param1]
嵌套异常是 org.apache.ibatis.binding.BindingException:找不到参数 'id'。可用参数为 [ids, param1]
根据错误信息ibatis.binding.BindingException
可知,这是mybatis
框架报出的错误。
但凡报出nested exception is org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found此类错误,一般都是xxxMapper.java类中的方法形参名称和xxxMapper.xml配置文件中的占位符名称不一致导致的,可以有如下两种解决方法:
- 修改xxxMapper.xml配置文件中的占位符名称,使其和xxxMapper.java类中@param注解参数一致。
- 修改xxxMapper.java类中@param注解参数,使其和xxxMapper.xml配置文件中的占位符保持一致。
此处解释@Param
注解的作用,当我们的sql
中需要多个参数时。Mybatis
会将参数列表中的参数封装成一个Map
进行传递,这个过程是通过@Param
来实现的。
@Param
注解括号中的值会作为key
,value
就是参数实际的值。
解析参数的时候会按照@Param
中定义的key
获取对应的值,如下代码所示:
void insertNewAdminRelationship(
@Param("adminId") Integer adminId,
@Param("roleIdList") List<Integer> roleIdList
);
这样MyBayis
传递的是就是一个{"adminId":adminId,"roleIdList":roleIdList}
的形式,当sql
运行的时候取值的方式就是通过get("roleIdList")
来获取值的。
当然我的代码是没问题的但是我运行postman就是报错,研究了很久发现了问题
创建文件的时候搞错了文件名
3.文末总结
映射关系在映射的时候注意参数一致
一定注意文件名一致