You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java向MySQL插入数据报错:java.sql.SQLException参数索引越界

解决Java插入MySQL时的java.sql.SQLException: Parameter index out of range错误

嘿,这个错误我太熟了!咱们直接拆解问题:

核心问题所在

你写的SQL语句里根本没有使用PreparedStatement需要的占位符?,而是直接把Java变量名写进了VALUES里,导致PreparedStatement认为这条SQL没有需要填充的参数(参数数量为0),但你却调用了setInt(1, id)这类设置第1、2...个参数的方法,自然就触发了参数索引越界的错误。

另外还有个小拼写错误:SQL里的satus应该是status,不然插入时还会报字段不存在的错误。

修正后的代码

public void insertData(int id,String name, String status, String age){
    // 修正1:用?作为占位符,替换直接写变量名的写法
    // 修正2:把satus改成正确的status字段名
    String sql = "INSERT INTO student_table (id,name,status,age) VALUES (?,?,?,?)"; 
    try (Connection conn1 = this.connects();
         PreparedStatement Prepst= conn1.prepareStatement(sql)){
        Prepst.setInt(1, id);
        Prepst.setString(2, name);
        Prepst.setString(3, status);
        Prepst.setString(4, age);
        // 别忘了执行更新操作
        Prepst.executeUpdate();
    } catch (SQLException e) {
        // 添加异常处理方便排查问题
        e.printStackTrace();
    }
}

为什么这样改?

  • PreparedStatement的设计就是通过?标记需要动态填充的参数位置,再通过setXxx(index, value)方法按顺序填充,索引从1开始计数。
  • 直接写变量名的静态SQL写法,不仅会导致当前的参数匹配错误,还存在SQL注入的风险,用占位符才是PreparedStatement的标准安全用法。

内容的提问来源于stack exchange,提问作者Klayd Pro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:56:49