0

我正在尝试创建一个在数据库中插入数据的 java 应用程序。应用程序相当简单。它从用户那里获取 3 个输入并将该输入插入到数据库中。一切正常,但执行插入语句时出现 sql 错误。这是代码片段。

sa.executeUpdate("INSERT INTO history (to, subject, body)"+"VALUES("+ DATA1 + "','" + DATA2 + "','" +DATA3+ "')'");

我确定我在声明中遇到了双引号和单引号的问题。

4

4 回答 4

6

你应该总是用PreparedStatements 来做这种事情。它会为您处理报价并保护您免受 SQL 注入攻击:

PreparedStatement statement = connection.prepareStatement("INSERT INTO history (to, subject, body) VALUES (?, ?, ?)");
statement.setString(1, DATA1);
statement.setString(2, DATA2);
statement.setString(3, DATA3);
statement.execute();

不仅如此,数据库驱动程序还可以编译和缓存准备好的语句,从而有可能提高它们的效率。

请注意,setString索引是从 1 开始的,而不是从零开始的。

于 2012-09-28T04:50:28.320 回答
1
sa.executeUpdate("INSERT INTO history (to, subject, body)"+"VALUES("+ DATA1 + "','" + DATA2 + "','" +DATA3+ "')'");

此代码将产生如下查询:

INSERT INTO history (to, subject, body)VALUES(vinesh','raja','1111')'

您必须在最后一个 ')' 之后删除单引号,并在 'VALUES' 之后添加单引号。

而是尝试以下代码:

sa.executeUpdate("INSERT INTO history (to, subject, body)"+"VALUES('"+ DATA1 + "','" + DATA2 + "','" +DATA3+ "')");
于 2012-09-28T04:28:15.910 回答
0

正如 Vinesh 提出的解决方案,我只想告诉你,最好将一个变量作为

String query="SQL QUERY";
then just do System.out.println(query);

然后运行线路,

PreparedStatement statement = connection.prepareStatement(query)

这样,您将正确识别形成的最终查询。

于 2012-09-28T04:57:12.673 回答
-1

1.而不是使用字符串类使用字符串缓冲区或字符串生成器,这是一个可变类。另一方面,字符串类是不可变的。您可以使用字符串缓冲区

  1. String Buffer stbuffer = new String Buffer();

    stbuffer.append("insert into ");
    stbuffer.append("<tablename> ");
    stbuffer.append("<fields >");
    stbuffer.append(" values");
    stbuffer.append("(+");
    stbuffer.append(String);
    stbuffer.append(")");  ....etc
    
  2. 您可以使用获得最终的字符串表示stbufffer.toString();

  3. 您可以插入此类查询来执行update()方法,例如ins.executeUpdate(stbuffer.toString);

  4. 您也可以像这样将它用于 Insert 语句和 Prepared Statement

于 2012-09-28T05:22:43.487 回答