java代码中的sql查询有什么问题

时间:2013-08-29 19:27:36

标签: java mysql sql jdbc

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();

3 个答案:

答案 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 - [...],PreparedStatementCallableStatement

上调用该方法

您需要使用executeUpdate()(所以没有参数)来执行PreparedStatement。原因是:预准备语句已经知道它的查询(它是用它创建的),所以在执行时提供查询是没有意义的。

请注意,MySQL实现并不完全符合JDBC。它实际上允许在此处使用String执行,但由于参数占位符而导致语法错误。

您的第一段代码将从不工作,因为参数只能用于值的位置,而不能用于需要对象名称(如表名称)的位置。

答案 2 :(得分:0)

@SotiriosDelimanolis给了你答案。

以不同方式构建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();