executeUpdate()不添加字符串变量

时间:2016-01-10 15:32:26

标签: java database

我已经创建了这样的声明:

String query = "INSERT INTO ZMONES (ID, PAVADINIMAS, SLAPTAZODIS) VALUES("
    +sum+" ,"+a+", "+b+")";

其中变量sum是数据库表中的整数ID,a和b是要添加的两个字符串值。我正在执行此声明:stmt.executeUpdate(query);

然而,此错误会弹出:

  

专栏' PERSON'要么不在FROM列表中的任何表中,要么不在appers中   在连接规范中,并且超出了连接的范围   规范或出现在having子句中,不在GROUP BY中   名单。如果这是一个CREATE或ALTER TABLE语句,那么' PERSON'是   不是目标表中的列。

我确实理解Java将其解释为列的名称,但我不明白为什么会发生这种情况?我在stackoverflow中搜索了这个,大多数问题都是处理文本而不是字符串变量。

2 个答案:

答案 0 :(得分:4)

您遇到的错误可以轻松纠正如下(假设sum是一个数字):

String query = "INSERT INTO ZMONES (ID, PAVADINIMAS, SLAPTAZODIS) VALUES("
    +sum+" ,'"+escape(a)+"', '"+escape(b)+"')";

其中escape(String)是以下方法:

public String escape(String string) {
    // This works in most databases, although some require you to escape apostrophes via \'
    return string == null ? null : string.replace("'", "''");
}

关于SQL注入的说明

但请!不要那样做。使用PreparedStatement和正确的绑定变量,而不是将输入连接到SQL语句中。为什么呢?

以下是:

try (PreparedStatement s = connection.prepareStatement(
    "INSERT INTO ZMONES (ID, PAVADINIMAS, SLAPTAZODIS) VALUES (?, ?, ?)")) {
    s.setInt(1, sum);
    s.setString(2, a);
    s.setString(3, b);
    s.executeQuery();
}

答案 1 :(得分:1)

您需要用引号括起字符串:

String query = "INSERT INTO ZMONES (ID, PAVADINIMAS, SLAPTAZODIS) VALUES("+sum+", '"+a+"', '"+b+"')";