我正在编写一个网页,它从表单中获取输入,通过 cgi 将其发送到 java 文件,通过 sql 将输入插入数据库,然后打印出数据库。不过,我在使用变量插入数据库时遇到了问题,我想知道是否有人能够帮助我。
String a1Insert = (String)form.get("a1");
String a2Insert = (String)form.get("a2");
这是我从表单获取变量的地方(只要相信它有效,还有更多后端,但我以前使用过它,我知道它可以正确获取变量)。
String dbURL = "jdbc:derby://blah.blahblah.ca:CSE2014;user=blah;password=blarg";
Connection conn = DriverManager.getConnection(dbURL);
Statement stmt = conn.createStatement();
stmt.executeUpdate("set schema course");
stmt.executeUpdate("INSERT INTO MEMBER VALUES (a1Insert, a2Insert)");
stmt.close();
这是我尝试插入数据库的地方。它给我错误:
Column 'A1INSERT' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'A1INSERT' is not a column in the target table.
如果有人有任何想法会很可爱 ^.^ 谢谢
最佳答案
java.sql.Statement
不支持参数,切换到java.sql.PreparedStatement
将允许您设置参数。将 SQL 中的参数名称替换为 ?
,并在准备好的语句上调用 setter 方法为每个参数赋值。这看起来像
String sql = "INSERT INTO MEMBER VALUES (?, ?)";
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setString(1, "a1");
stmt.setString(2, "a2");
stmt.executeUpdate();
这将执行 SQL
INSERT INTO MEMBER VALUES ('a1', 'a2')
请注意参数索引从 1 开始,而不是 0。另请注意,我不必在字符串上加引号,PreparedStatement 帮我做了。
或者,您可以继续使用 Statement 并在 Java 代码中创建 SQL 字符串,但这会引入 SQL 注入(inject)攻击的可能性。使用 PreparedStatement 设置参数可以避免该问题,因为它会为您处理报价;如果它在参数值中找到引号,它将对其进行转义,这样它就不会影响包含它的 SQL 语句。
Oracle 有一个 tutorial在这里。
关于java - 在 Java 中使用 SQL 插入变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22922184/