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

Arj*_*rma -2 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();
Run Code Online (Sandbox Code Playgroud)

错误说查询有问题.我使用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();
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 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
Run Code Online (Sandbox Code Playgroud)

请注意,您很容易受到SQL注入攻击.

如果由于某种原因出错,请删除所有引号.

String sql = "UPDATE test.books SET " + whatToUp + " = ? WHERE isbn = ?;";
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,那么您的架构不匹配.随你(由你决定.

在我急于回答的时候,我没有看到你在使用

ps.executeUpdate(sql); 
Run Code Online (Sandbox Code Playgroud)

这个方法的javadoc说

注意:无法在PreparedStatement或CallableStatement上调用此方法.

你必须使用

ps.executeUpdate(); 
Run Code Online (Sandbox Code Playgroud)

因为你已经为方法提供了sql语句.

如果您刚刚提供了异常堆栈跟踪,所有这些都将非常快速地解决.考虑下次你问一个问题