org.apache.ibatis.binding.BindingException: Parameter not found,使用@Param注解与不使用@Param注解

本文详细解析了在Spring+SpringMVC+Mybatis项目中遇到的BindingException异常,阐述了如何正确使用@Param注解来解决多参数传递问题,以及在不同情况下如何正确引用参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSM异常

今天在做一个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,以后类推。

谢谢欣赏!
期望与您共同进步!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老司机张师傅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值