Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java代码中的sql查询有什么问题_Java_Mysql_Sql_Jdbc - Fatal编程技术网

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

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,

错误表示查询有问题。我正在使用MySQL 5.6。 我从workbench 6.0复制了该语句,并将
放在需要的地方

即使这样也会产生错误:

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