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();
错误说查询有问题。我使用MySQL 5.6。
我从工作台6.0中复制了该语句,并将?
放在我需要的任何地方。
即便如此,也会出错:
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();
答案 0 :(得分:8)
您可以动态构建查询
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
请注意,您很容易受到SQL注入攻击。
如果出于某种原因这是错误的,请删除所有引号。
String sql = "UPDATE test.books SET " + whatToUp + " = ? WHERE isbn = ?;";
如果这不起作用,那么您的架构不匹配。这取决于你。
我急于回答我没看到你在使用
ps.executeUpdate(sql);
此方法的javadoc说
注意:无法在PreparedStatement上调用此方法 的CallableStatement。
你必须使用
ps.executeUpdate();
因为你已经为方法提供了sql语句。
如果您刚刚提供了异常堆栈跟踪,所有这些都将非常快速地解决。考虑下次你问一个问题
答案 1 :(得分:2)
问题是您在PreparedStatement
上呼叫executeUpdate(String)
,文档说明了这一点:
上调用该方法
SQLException
- [...],在PreparedStatement
或CallableStatement
您需要使用executeUpdate()
(所以没有参数)来执行PreparedStatement
。原因是:预准备语句已经知道它的查询(它是用它创建的),所以在执行时提供查询是没有意义的。
请注意,MySQL实现并不完全符合JDBC。它实际上允许在此处使用String
执行,但由于参数占位符而导致语法错误。
您的第一段代码将从不工作,因为参数只能用于值的位置,而不能用于需要对象名称(如表名称)的位置。
答案 2 :(得分:0)
以不同方式构建SQL字符串
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();