我正在尝试创建一个在数据库中插入数据的 java 应用程序。应用程序相当简单。它从用户那里获取 3 个输入并将该输入插入到数据库中。一切正常,但执行插入语句时出现 sql 错误。这是代码片段。
sa.executeUpdate("INSERT INTO history (to, subject, body)"+"VALUES("+ DATA1 + "','" + DATA2 + "','" +DATA3+ "')'");
我确定我在声明中遇到了双引号和单引号的问题。
你应该总是用PreparedStatement
s 来做这种事情。它会为您处理报价并保护您免受 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 开始的,而不是从零开始的。
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+ "')");
正如 Vinesh 提出的解决方案,我只想告诉你,最好将一个变量作为
String query="SQL QUERY";
then just do System.out.println(query);
然后运行线路,
PreparedStatement statement = connection.prepareStatement(query)
这样,您将正确识别形成的最终查询。
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
您可以使用获得最终的字符串表示stbufffer.toString();
您可以插入此类查询来执行update()
方法,例如ins.executeUpdate(stbuffer.toString);
您也可以像这样将它用于 Insert 语句和 Prepared Statement