java代码中的sql查询有什么问题
错误表示查询有问题。我正在使用MySQL 5.6。 我从workbench 6.0复制了该语句,并将java代码中的sql查询有什么问题,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,错误表示查询有问题。我正在使用MySQL 5.6。 我从workbench 6.0复制了该语句,并将?放在需要的地方 即使这样也会产生错误: String sql = "UPDATE `test`.`books` SET ? = ? WHERE `isbn` = ?;"; PreparedStatement ps = null; ps = conn.prepareStatement(sql); ps.setString(1,
?
放在需要的地方
即使这样也会产生错误:
String sql = "UPDATE `test`.`books` SET ? = ? WHERE `isbn` = ?;";
PreparedStatement ps = null;
ps = conn.prepareStatement(sql);
ps.setString(1,whatToUp);
ps.setString(2, data);
ps.setString(3, isbn);
ps.executeUpdate(sql);
System.out.println("Statement executed");
conn.close();
您可以动态地构建查询
String sql = "UPDATE `test`.`books` SET `title` = ? WHERE `isbn` = ?;";
PreparedStatement ps = null;
ps = conn.prepareStatement(sql);
ps.setString(1, data);
ps.setString(2, isbn);
ps.executeUpdate(sql);
System.out.println("Statement executed");
conn.close();
请注意,这样您就容易受到SQL注入的攻击
如果由于某种原因这是错误的,请删除所有引号
String sql = "UPDATE `test`.`books` SET " + whatToUp + " = ? WHERE `isbn` = ?;";
PreparedStatement ps = null;
ps = conn.prepareStatement(sql);
ps.setString(1, data);
ps.setString(2, isbn);
ps.executeUpdate(); // you need to use the overloaded method without an argument
如果这不起作用,那么您的模式就不匹配。这取决于你
在我急于回答的时候,我没有看到你在使用
String sql = "UPDATE test.books SET " + whatToUp + " = ? WHERE isbn = ?;";
这个方法的javadoc说
注意:不能对PreparedStatement或
可调用声明
你必须使用
ps.executeUpdate(sql);
因为您已经为该方法提供了sql语句
如果您刚刚提供了异常堆栈跟踪,那么所有这些问题都会很快得到解决。考虑下一次你问一个问题p>@ SotiriosDelimanolis给你答案。 只需以不同的方式构建SQL字符串
ps.executeUpdate();
问题在于,您正在调用一个
PreparedStatement
,文档中对此说明:
SQLException
-[…],在PreparedStatement
或CallableStatement
上调用该方法
您需要使用(因此不带参数)来执行PreparedStatement
。原因是:一个准备好的语句已经知道它的查询(创建它时使用的查询),所以在执行它时提供查询是没有意义的
请注意,MySQL实现并不完全符合JDBC。它实际上允许在此处使用字符串执行,但由于参数占位符的存在,它会导致语法错误
您的第一段代码将永远不起作用,因为参数只能在值的位置使用,而不能在需要对象名(如表名)的位置使用。您不能执行设置?=代码>。关于另一个主题:为什么人们使用这么多引号来包装字段名?我只是复制了workbench在手动进行更新时执行的确切语句。@SotiriosDelimanolis我想让用户能够在列中进行更改,他希望这样做。那么我该怎么做呢?据我所知,没有一个DBMS允许在准备好的SQL语句中使用列/表名作为参数。您需要改为使用动态SQL。它抛出的错误到底是什么?@ArjunVerma您显然必须更改PreparedStatement
setters。这仍然会导致异常,请参阅@ArjunVerma您还有“;”吗在SQL语句中?这在任何数据库中都是一个非常基本的update语句,然后会发生其他情况,要么数据类型与列(whattup)数据类型不匹配,要么???@Mike-您必须使用ps.executeUpdate(sql.toString())而不是ps.executeUpdate(),因为您已经传递了sql.toString()
在上述第5条声明中。此外,Javadoc表示不能对PreparedStatement或CallableStatement调用此方法executeUpdate(arg)
。您必须在没有参数的情况下调用executeUpdate()。请阅读和的答案
Stringbuilder sql = new Stringbuilder("UPDATE test.books SET ");
sql.append(whatToUp);
sql.append(" = ? WHERE isbn = ?");
PreparedStatement ps = null;
ps = conn.prepareStatement(sql.toString());
ps.setString(1, data);
ps.setString(2, isbn);
ps.executeUpdate(sql.toString());
System.out.println("Statement executed");
conn.close();