Mabatis报错 java.sql.SQLException: Parameter number 3 is not an OUT parameter 解决方法

本文记录了一次调用MySQL存储过程时遇到的错误:java.sql.SQLException:Parameter number 3 is not an OUT parameter。经过排查发现是因为存储过程名字拼写错误导致的问题。

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

有需求需要调用一个存储过程,写完代码后,上测试类一跑,(⊙﹏⊙)b,调用MySQL带输入输出参数存储过程出现如下错误:

     java.sql.SQLException: Parameter number 3 is not an OUT parameter 

因为 数据库中定义 PROCEDURE user_recommend_check(IN in_user_id varchar(45),IN in_recommend_id varchar(45),out out_value int) ,把注意力放在了参数上面,一直在检查为什么out这个参数报错。

查阅各种方法,检查各种问题,什么注解什么传参过程等等,一直报错!

但不得不说这里是一个坑,自己填上,真正的原因是 存储过程的名字写错了,不信你自己检查一次!!!

我把xml文件中select语句中的 user_recommend_check 潜意识的写成了 userRecommendCheck

各位同仁,是否有一种尴尬的气氛缭绕,好了,默默关掉吧。

### 参数索引超出范围问题分析 `javax.servlet.ServletException` 和 `java.sql.SQLException: Parameter index out of range` 是常见的 Java 数据库操作异常。以下是针对这两种异常的具体解决方案。 #### 1. **Servlet Exception 的根本原因** 当在 Spring Boot 或其他基于 Servlet 容器的应用程序中执行 SQL 查询时,如果底层 JDBC 调用失败,则会抛出 `javax.servlet.ServletException` 异常[^1]。此异常通常是由嵌套的 `SQLException` 导致的。因此,解决问题的关键在于定位并修复引发 `SQLException` 的具体代码逻辑。 #### 2. **SQL Exception 参数索引超出范围的原因** `java.sql.SQLException: Parameter index out of range` 表明传递给 PreparedStatement 的参数数量与实际占位符的数量不匹配。这可能是由于以下原因之一引起的: - 预编译语句中的占位符 `{}` 数量不足或多余。 - 在调用 `setString()` 方法或其他设置方法时,指定的参数索引超出了实际存在的占位符范围。 - 如果使用 MyBatis 框架,在配置文件中可能误加了多余的单引号 `&#39; &#39;`,从而改变了 SQL 的解析方式[^2]。 #### 3. **解决方案** ##### (1)检查预编译 SQL 中的占位符 确保 SQL 语句中的占位符数量与绑定参数一致。例如: ```sql SELECT * FROM orders WHERE order_date >= ? AND customer_id = ? ``` 在此情况下,应提供两个参数值来填充这两个占位符。如果只提供了其中一个参数值,则会出现参数索引超出范围的错误。 ##### (2)移除不必要的单引号 如果是通过框架(如 MyBatis)动态注入参数,需注意不要手动添加额外的单引号。例如: ```xml <if test="date != null"> AND DATE_FORMAT(order_date, &#39;%Y-%m&#39;) = #{date} </if> ``` 这里无需为 `#{date}` 添加单引号,因为框架会自动处理字符串类型的参数[^2]。 ##### (3)验证参数索引顺序 确认每次调用 `PreparedStatement.setXXX(index, value)` 时使用的索引是否正确。例如: ```java preparedStatement.setString(1, "value1"); preparedStatement.setInt(2, 123); ``` ##### (4)调试日志排查 启用详细的 SQL 日志记录功能可以帮助快速找到问题所在。对于 Spring Boot 应用程序,可以在 `application.properties` 文件中加入以下配置项: ```properties spring.jpa.show-sql=true logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE ``` #### 4. **示例代码修正** 假设原始代码如下所示: ```java String sql = "SELECT COUNT(*) FROM users WHERE username = ?"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setString(1, userName); // 正确绑定第一个参数 } catch (SQLException e) { throw new ServletException(e.getMessage(), e); } ``` 如果出现参数索引超出范围的问题,请仔细核对 SQL 语句以及绑定参数的过程。 --- ### 总结 通过对上述引用内容的综合分析可以得出结论:`Parameter index out of range` 错误的根本原因是参数绑定过程中存在逻辑偏差。建议按照以上步骤逐一排查问题,并结合具体的业务场景调整代码实现。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值