UPDATE语句中使用intOne变量报错:SQLSyntaxErrorException权限或对象未找到
问题分析与解决方案
首先直接给结论:你不能直接在SQL查询字符串里使用Java变量intOne,这就是你触发SQLSyntaxErrorException的核心原因。
为什么会报错?
当你在SQL语句里写where col1=intOne时,数据库会把intOne当成一个数据库列名,而不是你Java代码里的变量。你的表tableOne里并没有名为intOne的列,所以数据库就会抛出“object not found: intOne”的异常——它以为你要查询这个列,但根本不存在。
另外,你的代码里还有几个其他小问题,也会导致运行异常:
- 在
oneValue()方法里:ps.executeQuery和rs.next都少了括号,应该是ps.executeQuery()和rs.next()- 你查询的是
col1,但取结果时用了rs.getString("columnName"),列名不匹配 intOne是while循环内部的局部变量,循环结束后这个变量就不存在了,return intOne会编译报错
- 在
theQuestionHere()方法里:- SQL语句末尾少了闭合的双引号,语法不完整
ps.executeUpdate少了括号,应该是ps.executeUpdate()- 判断时写了
if(int>0),int是Java关键字,应该用变量anotherInt
正确的写法:使用PreparedStatement的参数占位符
既然你已经在用PreparedStatement(这是非常好的习惯,能防止SQL注入),那就应该用?作为参数占位符,然后通过setXxx()方法把Java变量的值传入SQL语句。
修正后的完整代码示例:
// 修正oneValue()方法,解决变量作用域和语法问题 private int oneValue() throws SQLException { int intOne = 0; // 初始化变量,避免作用域问题 PreparedStatement ps = conn.prepareStatement("select col1 from tableOne"); ResultSet rs = ps.executeQuery(); while(rs.next()){ // 用查询的列名col1获取值,getString本身返回字符串,无需额外toString() String str = rs.getString("col1"); intOne = Integer.parseInt(str); } // 记得关闭资源,避免连接泄漏 rs.close(); ps.close(); return intOne; } // 修正theQuestionHere()方法,正确使用参数占位符 private void theQuestionHere(int intOne) throws SQLException { this.intOne = intOne; // 用?作为col1的参数占位符,补全闭合引号 String sql = "update tableOne set col2=? where col1=?"; PreparedStatement ps = conn.prepareStatement(sql); // 第一个?对应col2,设置字节数组 ps.setBytes(1, "anyByteArray".getBytes()); // 第二个?对应col1,传入intOne的值 ps.setInt(2, intOne); int anotherInt = ps.executeUpdate(); if(anotherInt > 0){ System.out.println("OK"); } else{ System.out.println("Not OK"); } ps.close(); }
额外提醒
如果使用Java 7及以上版本,推荐用try-with-resources语法自动关闭ResultSet、PreparedStatement等资源,能更安全地避免数据库连接泄漏。
内容的提问来源于stack exchange,提问作者Mohd
相关产品推荐
相关产品推荐

