mybatis 异常:Parameter 'id' not found. Available parameters are

本文记录了一次MyBatis参数解析错误的问题,错误代码显示Parameter 'id' not found,详细解析了问题的原因在于参数传递方式不当导致id无法正确解析,并提供了解决方案,即去除id的设置并直接使用参数。

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

mybatis 异常:Parameter 'id' not found. Available parameters are

错误代码

下班前发现同事提交代码报错,错误代码如下所示
sql

    <insert id="addUsTmApplication" keyProperty="id" useGeneratedKeys="true">
        insert into biz_us_tm_application(trademark_id,data) values(#{trademarkId},#{data})
    </insert>

异常日记

<== Updates: 1
Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@61be765e]
19:18:19 ERROR c.z.p.c.o.s.i.OrderImportServiceImpl - error in save us tm import application
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter ‘id’ not found. Available parameters are [data, trademarkId, param1, param2]

问题原因

mybatis解析出错,参数是通过param方式传入的,id无法解析到对应的属性

解决方法

既然没有对象是承接id,就不要在多次一举了,害人又害己

    <insert id="addUsTmApplication" >
        insert into biz_us_tm_application(trademark_id,data) values(#{trademarkId},#{data})
    </insert>
<think>好的,我现在需要解决用户在MyBatis更新操作时遇到的BindingException异常,具体错误是Parameter 'id' not found. Available parameters are [lastEditor, param1, req]。首先,我得分析这个问题的可能原因,然后给出解决方案。 首先,用户提到的错误信息表明MyBatis在解析参数时找不到名为'id'的参数。根据引用[1]到[4],这类问题通常是由于参数传递方式不正确导致的。MyBatis在处理Mapper接口方法的参数时,如果没有使用@Param注解,默认会将这些参数转换为param1, param2等,或者使用arg0, arg1这样的名称。如果SQL语句中引用了参数名如#{id},而实际参数中没有对应的名称,就会抛出这个异常。 接下来,我需要考虑用户的具体情况。用户是在执行更新操作时出现这个问题的,可能是在Mapper接口的方法中传递了多个参数,但没有正确指定参数名称。比如,方法可能定义为void updateUser(Long id, User user, String lastEditor),而在XML中使用了#{id}、#{user.name}等参数。这时候,如果没有使用@Param注解,MyBatis无法识别这些名称,只能通过param1param2或者arg0、arg1来引用参数。 根据引用[3]和[4],解决方法主要有两种:一种是使用@Param注解显式指定参数名;另一种是在XML中使用param1param2等方式引用参数。例如,在Mapper接口中,给每个参数加上@Param("id")、@Param("user")等注解,这样在XML中就可以直接使用#{id}、#{user.name}了。如果不想修改接口,也可以在XML中将#{id}改为#{param1},#{user}改为#{param2},但这样可读性较差。 另外,用户错误信息中的Available parameters are [lastEditor, param1, req]可能表明用户传递的参数中有lastEditor、req,但id可能被错误地命名或未正确传递。需要检查Mapper接口方法的参数列表,确认是否有名为id的参数,或者是否遗漏了@Param注解。 可能的步骤包括: 1. 检查Mapper接口方法,确认参数是否有@Param注解。 2. 如果参数是对象,检查是否正确通过属性路径访问,比如#{user.id}。 3. 如果参数是多个单独参数,确保每个都使用@Param注解指定名称。 4. 或者修改XML中的参数引用方式,使用param1、arg0等默认名称。 例如,如果用户的方法定义为: int updateUser(@Param("id") Long id, @Param("req") User user, @Param("lastEditor") String lastEditor); 对应的XML应该使用#{id}, #{req.property}, #{lastEditor}。如果没有使用@Param,则需要用#{param1}, #{param2}等。 此外,检查是否有拼写错误,比如XML中的参数名是否和方法中的参数名一致。例如,用户可能在XML中误写成了#{id},而实际参数名是req中的属性,这时候应该使用#{req.id}。 总结,问题根源在于参数名称未正确映射到XML中的占位符。解决方法就是通过@Param注解明确参数名称,或者调整XML中的引用方式。</think>### MyBatis更新操作BindingException异常解决方案 当使用MyBatis执行更新操作时,若出现`BindingException: Parameter 'id' not found. Available parameters are [lastEditor, param1, req]`异常,通常是因为**参数名称未正确映射到XML中的占位符**。以下是具体原因和解决步骤: --- #### **原因分析** 1. **未使用@Param注解** 如果Mapper接口方法有多个参数且未通过`@Param`指定名称,MyBatis会默认生成参数别名(如`param1`、`param2`或`arg0`、`arg1`),而非实际参数名。此时,若XML中直接使用`#{id}`,MyBatis无法找到匹配的参数[^3][^4]。 2. **参数是对象但未通过属性路径访问** 若参数是一个对象(如`User`),但XML中未通过对象属性路径(如`#{req.id}`)引用,而是直接使用`#{id}`,也会导致此问题。 3. **参数名称拼写错误** XML中的占位符名称与接口方法参数名称不一致(如大小写错误或拼写错误)。 --- #### **解决方法** ##### **方法1:使用@Param注解显式命名参数** 在Mapper接口方法中,为每个参数添加`@Param("name")`注解,明确指定参数名称。 ```java // Mapper接口方法 int updateUser( @Param("id") Long id, @Param("req") User user, @Param("lastEditor") String lastEditor ); ``` XML映射文件中使用注解定义的名称: ```xml <update id="updateUser"> UPDATE user SET name = #{req.name}, editor = #{lastEditor} WHERE id = #{id} </update> ``` ##### **方法2:通过param索引引用参数(不推荐)** 若不想修改接口代码,可以在XML中使用`param1`、`param2`等默认别名,但会降低可读性。 ```xml <update id="updateUser"> UPDATE user SET name = #{param2.name}, editor = #{param3} WHERE id = #{param1} </update> ``` ##### **方法3:使用单一对象参数** 将多个参数封装为一个对象(如`UpdateRequest`),直接通过对象属性访问。 ```java // Mapper接口方法 int updateUser(UpdateRequest request); ``` ```xml <update id="updateUser"> UPDATE user SET name = #{request.user.name}, editor = #{request.lastEditor} WHERE id = #{request.id} </update> ``` --- #### **验证与调试** 1. **检查参数传递逻辑** 确保方法调用时传递的参数与接口定义一致。 2. **启用MyBatis日志** 在`application.properties`中添加以下配置,查看实际绑定的参数: ```properties logging.level.org.mybatis=DEBUG ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值