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

在JAVA中SQL语句的where子句中使用变量,java,mysql,sql,sqlexception,where-in,Java,Mysql,Sql,Sqlexception,Where In,我想根据变量(supp\u recarray)中存储的值从数据库中选择一些行。我在以前类似的帖子/问题上使用过一些技巧。但是,我仍然有一些错误消息。代码片段如下所示: waiting_time = dbMngr.runQuery( "SELECT " + "ExpectedWaitingTime" + " FROM Student" + "where deptID = '" + supp_rec[1] + "' and weight = '" + supp_rec[2] + "'");

我想根据变量(
supp\u rec
array)中存储的值从数据库中选择一些行。我在以前类似的帖子/问题上使用过一些技巧。但是,我仍然有一些错误消息。代码片段如下所示:

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)

如果您能帮助我解决这些错误,我将不胜感激。谢谢。

mysql错误消息是

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您有一个 SQL语法错误;检查与您的产品相对应的手册 MySQL服务器版本,以便在“deptID NOT”附近使用正确的语法 在sun.reflect.NativeConstructor Accessorimpl.newInstance0(本机方法)的第1行中,1IN1和8IN8

因此,在没有空间的情况下,mysql尝试在1中解析,作为其语法的一部分&因此查询失败。它应该是1中的,其中中的是有效的SQL标记

要更正此问题,请在语句中的之后添加空格-

dbMngr.execUpdate( "DELETE " + " FROM Student" + "where deptID NOT IN " + supp_rec[1] + " and weight NOT IN " + supp_rec[2]);
编辑:注意到您正在为而不是在中传递单个值。在这种情况下,它应该是=运算符

dbMngr.execUpdate( "DELETE " + " FROM Student" + "where deptID != " + supp_rec[1] + " and weight != " + supp_rec[2]);
在变量内容之间添加了
()
,在变量内容之间添加了空格,并设置了一点格式

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

另外,这对你来说风险很高,不使用保护措施

你真的应该使用事先准备好的声明。SQL将更易于阅读,并且可以避免大多数问题。

使用占位符。首先将代码更新为该值,然后再次询问。在任何情况下,如果您查看实际的SQL文本,您将立即看到几个语法问题。这是一种非常混乱的处理方式。而不是“选择”+变量“语句的其余部分”;尝试String.format(“选择%s语句的其余部分;”,变量)@735Tesla但是对任意值使用
String.format
是处理整个任务的一种方法。另外,我不知道您是否希望这样做,但是在引号中包含
ExpectedWaitingTime
使它可以对字符串字母进行解析,而不是查看变量的值。如果它不是一个变量,为什么不把它全部放在一个字符串中呢?@735Tesla说实话,这并不重要。教授可以持续应用的好技巧。仍然存在错误。(至少缺少一个空格,我怀疑
supp_rec[x]
在运算符中无效,特别是因为我怀疑它们缺少括号,但我不完全确定它们应该包含什么。)谢谢大家的评论。错误现已解决。