在JAVA中使用SQL语句的where子句中的变量

时间:2014-01-25 19:28:13

标签: java mysql sql sqlexception where-in

我想根据存储在变量(supp_rec数组)中的值从数据库中选择一些行。我使用过类似的帖子/问题提示。但是,我仍然有一些错误消息。代码段如下:

waiting_time = dbMngr.runQuery( "SELECT " + "ExpectedWaitingTime" + " FROM Student" +     "where deptID = '" + supp_rec[1] + "' and weight = '" + supp_rec[2] + "'");
prob = PoisonModel(Phase3GUI.existence_time -     Long.parseLong(waiting_time[0]),2,Phase3GUI.existence_time);
if (prob > 0.5)
 {
    dbMngr.execUpdate( "DELETE " + " FROM Student" + "where deptID NOT IN" + supp_rec[1] + " and weight NOT IN" + supp_rec[2]);
 }+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

错误信息如下:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'deptID NOT IN1 and weight NOT IN8' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= '1' and weight = '8'' at line 1
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

请相信如何解决这些错误的任何帮助。谢谢。

3 个答案:

答案 0 :(得分:1)

mysql错误消息是

  

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:你有一个   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本,用于在'deptID NOT附近使用正确的语法   在sun.reflect.NativeConstructorAccessorImpl.newInstance0(原生方法)的第1行 IN1 和权重不是 IN8 '

因此,如果没有空格,mysql会尝试解析 IN1 作为其语法和语言的一部分。因此查询失败。它应该是 IN 1 ,其中 IN 是有效的SQL令牌。

要更正此问题,请在语句

中的 IN 之后添加空格
dbMngr.execUpdate( "DELETE " + " FROM Student" + "where deptID NOT IN " + supp_rec[1] + " and weight NOT IN " + supp_rec[2]);

编辑:注意到您为 NOT IN 传递了一个值。在这种情况下,它应该只是!= 运算符。

dbMngr.execUpdate( "DELETE " + " FROM Student" + "where deptID != " + supp_rec[1] + " and weight != " + supp_rec[2]);

答案 1 :(得分:1)

在变量内容,它们之间的空格和格式化之间添加了()

dbMngr.execUpdate(String.format("DELETE FROM Student WHERE deptID NOT IN (%s) and weight NOT IN (%s)", supp_rec[1], supp_rec[2]));

另外,这对您来说风险很大,而不是对SQL Injections使用保护

答案 2 :(得分:0)

你应该使用PreparedStatement。 SQL将更容易阅读,您将避免大多数这些问题。