今天在做一个Spring+springMVC+Mybais项目时,出现了一个很让人费解的异常,
org.apache.ibatis.binding.BindingException: Parameter ‘userId’ not found. Available parameters are [arg1, arg0, param1, param2]
意思是说我的这个userId的参数有异常,而我检查页面后发现页面上并没有什么问题,Debug发现参数也正常传递到了UserController,controller传递给service,service调用dao,参数的传递没有任何问题,但是dao层进行查询数据库时却出现了问题,我的持久层接口相关代码如下:
/**
* 向指定用户添加角色
* @param userId
* @param roleId
* @throws Exception
*/
@Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
public void addRoleToUser(String userId, String roleId) throws Exception;
经过检查是这段代码出现了异常,方法参数是有值的,可是#{userId}却没有找到,后来查找相关信息后才明白,原来想使用mybatis注解配置使用ognl表达式时,方法上的参数如果有多个,必须使用@Param(“参数名”)注解声明,修改后的相关代码如下:
/**
* 向指定用户添加角色
* @param userId
* @param roleId
* @throws Exception
*/
@Insert("insert into users_role(userId,roleId) values(#{userId},#{roleId})")
public void addRoleToUser(@Param("userId") String userId, @Param("roleId") String roleId) throws Exception;
其@Param(“参数名”)中的参数名必须与#{}中的调用名称对应,这样就解决了多参数传递无法找到对应值的问题。
我们在出现 Parameter ‘*’ not found. Available parameters are [arg1, arg0, param1, param2]这种异常时,可以锁定是我们的持久层的ognl表达式出了问题,这是直接去检查持久层对应的方法中的字段就可以了。
另外:不使用@Param注解时
方法的参数只有一个,并且是Javabean。在SQL语句里可以直接引用JavaBean的属性(注意:引用时与属性的名称必须对应,区分大小写):
@Select("SELECT * from Table where id = ${id}")
User findUserById(User user);
方法参数有多个,使用ognl语句调用时需要采用#{arg0},#{arg1}…#{argn},
其中0-n代表第1个参数~第n个参数,他们一一对应,如下述代码中,arg0就代表userId,arg1就代表roleId;
/**
* 向指定用户添加角色
* @param userId
* @param roleId
* @throws Exception
*/
@Insert("insert into users_role(roleId,userId) values(#{arg1},#{arg0})")
public void addRoleToUser(String userId, String roleId) throws Exception;
也可以是#{param1},#{param2}…#{paramn},作用与arg类似,不过是从1开始,param1代表参数1,以后类推。
谢谢欣赏!
期望与您共同进步!