我正在尝试创建一个在数据库中插入数据的java应用程序。应用程序非常简单。它从用户输入3个输入并将该输入插入数据库。一切正常但我得到执行插入语句的SQL错误。 这是代码段。
sa.executeUpdate("INSERT INTO history (to, subject, body)"+"VALUES("+ DATA1 + "','" + DATA2 + "','" +DATA3+ "')'");
我确信我在声明中遇到Double Quotes和Single Quotes的问题。
答案 0 :(得分:6)
你应该总是使用PreparedStatement
来做这种事情。它负责为您引用并保护您免受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开始的,而不是从零开始的。
答案 1 :(得分: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+ "')");
答案 2 :(得分:0)
当Vinesh建议解决方案时,我只想告诉你,更好的是你把一个变量作为
String query="SQL QUERY";
then just do System.out.println(query);
然后运行该行,
PreparedStatement statement = connection.prepareStatement(query)
这样,您将正确识别形成的最终查询。
答案 3 :(得分:-1)
1.Rather比使用String Class使用String Buffer或String Builder这是一个可变类。另一方面,String Class是不可变的。你可以像
一样使用字符串缓冲区 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