Available parameters are [list, param1];批量更新报错原因,mybatis标签错误,使用「select」「/select」导致,更换「update」正常

本文探讨了在使用MyBatis框架进行JDBC批处理更新时遇到的参数'berthId'未找到的问题,分析了错误原因并提出了可能的解决方案,涉及mybatis标签的正确使用。

Error querying database.  Cause: com.hikvision.exception.DaoException: org.apache.ibatis.binding.BindingException: Parameter 'berthId' not found. Available parameters are [list, param1]
### Cause: com.hikvision.exception.DaoException: org.apache.ibatis.binding.BindingException: Parameter 'berthId' not found. Available parameters are [list, param1]

Error querying database.  Cause: com.hikvision.exception.DaoException: org.apache.ibatis.binding.BindingException: Parameter 'berthId' not found. Available parameters are [list, param1]
### Cause: com.hikvision.exception.DaoException: org.apache.ibatis.binding.BindingException: Parameter 'berthId' not found. Available parameters are [list, param1]

使用JDBCbatchUpdate时报错,拷贝mybatis标签导致。

你遇到的错误信息如下: ``` Parameter &#39;definitionId&#39; not found. Available parameters are [ew, param1] ``` 这是 MyBatis-Plus 中常见的参数绑定异常,表示你在 SQL 中引用了 `#{definitionId}` 或 `<if test="definitionId != null">` 这样的表达式,但 MyBatis 无法找到名为 `definitionId` 的参数。 --- ### 🧠 错误原因分析 MyBatis-Plus 使用 MyBatis 的参数绑定机制。如果你没有使用 `@Param` 显式命名参数,或者在使用 `LambdaQueryWrapper` 等条件构造器时未正确访问其属性,就会出现这个错误。 --- ### ✅ 常见场景及修复方法 #### 场景一:Mapper 方法中未使用 `@Param` 注解(单个参数) ```java List<User> selectByDefinitionId(Long definitionId); ``` XML 中却写: ```xml <select id="selectByDefinitionId" resultType="..."> SELECT * FROM users <where> definition_id = #{definitionId} </where> </select> ``` ##### ❌ 问题: MyBatis 默认将单个参数命名为 `param1`,而不是你期望的 `definitionId`。 ##### ✅ 修复: 添加 `@Param("definitionId")` 注解: ```java List<User> selectByDefinitionId(@Param("definitionId") Long definitionId); ``` --- #### 场景二:使用 LambdaQueryWrapper 查询,但在 XML 中直接引用字段名 ```java List<User> list = userMapper.selectList(new LambdaQueryWrapper<User>() .eq(User::getDefinitionId, 123L)); ``` XML 中却写: ```xml <if test="definitionId != null"> AND definition_id = #{definitionId} </if> ``` ##### ❌ 问题: 此时实际可用参数是 `ew`(即传入的 `LambdaQueryWrapper`),不能直接访问 `definitionId`。 ##### ✅ 修复: 在 XML 中通过 `ew.entity.definitionId` 来访问: ```xml <if test="ew.entity.definitionId != null"> AND definition_id = #{ew.entity.definitionId} </if> ``` --- #### 场景三:多个参数未指定名称 ```java List<User> selectByCondition(Long definitionId, String name); ``` XML 中写: ```xml <if test="definitionId != null and name != null"> ... </if> ``` ##### ❌ 问题: 未使用 `@Param`,参数默认被命名为 `param1`, `param2`,而不是字段名。 ##### ✅ 修复: ```java List<User> selectByCondition( @Param("definitionId") Long definitionId, @Param("name") String name); ``` --- ### ✅ 总结处理方式 | 情况 | 正确做法 | |------|----------| | 单个参数未加 `@Param` | XML 中用 `#{param1}` 访问 | | 使用 `LambdaQueryWrapper` | XML 中通过 `ew.entity.xxx` 获取实体字段 | | 多个参数未命名 | 使用 `@Param("xxx")` 明确命名每个参数 | --- ### ✅ 示例修复代码 #### Mapper 接口 ```java List<User> selectByDefinitionId(@Param("definitionId") Long definitionId); ``` #### XML 配置 ```xml <select id="selectByDefinitionId" resultType="..."> SELECT * FROM users <where> <if test="definitionId != null"> AND definition_id = #{definitionId} </if> </where> </select> ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值