所以我在netbeans中创建的表中插入值时遇到了一个小问题。我将向您展示工作的代码,并在表中创建一个新的worker,然后向您展示当我试图更改它时出现的问题。
这个方法来自于一个叫做dbConnect.java的类
public void insertTableRow() {
try {
Connection con = DriverManager.getConnection(host, uName, uPass);
Statement stmt = con.createStatement();
String SQL = "INSERT INTO Workers VALUES (10, 'John', 'Smith', 'Engineer')";
stmt.executeUpdate(SQL);
} catch (SQLException err) {
System.out.println(err.getMessage());
}
}
在这里,我在主类中调用它。
dbConnect test = new dbConnect();
test.insertTableRow();
然后我看到约翰·史密斯出现了,所以我知道我有正确的代码。但是当我尝试将变量输入VALUES时,它就崩溃了。例如
public void insertTableRow(int id, String firstName, String lastName, String jobTitle) {
try {
int num = id;
String fName = firstName;
String lName = lastName;
String jTitle = jobTitle;
Connection con = DriverManager.getConnection(host, uName, uPass);
Statement stmt = con.createStatement();
String SQL = "INSERT INTO Workers VALUES (num, fName, lName, jTitle)";
stmt.executeUpdate(SQL);
} catch (SQLException err) {
System.out.println(err.getMessage());
}
}
与-
组合dbConnect test = new dbConnect();
test.insertTableRow(10, "John", "Smith", "Doctor");
System.out.println(test.getTableContents());
我得到的错误是:-列'NUM'要么不在FROM列表中的任何表中,要么出现在连接规范中,不在连接规范的范围内,要么出现在HAVING子句中,不在GROUP BY列表中。如果这是一个CREATE或ALTER TABLE语句,那么'NUM'不是目标表中的列。
所以我做错了什么,因为我完全不知道?
当我尝试在VALUES中输入变量时它就崩溃了
Statement stmt = con.createStatement(); String SQL = "INSERT INTO Workers VALUES (num, fName, lName, jTitle)"; stmt.executeUpdate(SQL);
你的没有发送任何变量。你有num
, fName
和其他变量,但你发送它们作为纯文本在你的SQL语句。您需要将变量的值传递到SQL语句中。
最好的方法是使用PreparedStatement
:
String SQL = "INSERT INTO Workers VALUES (?, ?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(SQL);
p.setInt(1, num);
p.setString(2, fName);
p.setString(3, lName);
p.setString(4, jTitle);
pstmt.executeUpdate();
pstmt.close();
您也可以使用简单的方法,将SQL语句中的每个变量的值连接起来,但这是不安全的,并且允许SQL注入攻击。因此,最好的选择是使用PreparedStatement
。
更多信息:
- Statement与PreparedStatement的区别