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
相关产品推荐
相关产品推荐

