我创建了一个小型3层程序,包括:前端 - > servlet - >数据库中。
前端我在表单中输入一些细节。它们被传递给servlet,它将呈现一些HTML并显示输入到表单中的值,同时还调用类DatabaseHelper。然后DatabaseHelper连接并将这些相同的值插入表中。
我知道值正在传递给servlet类ok,因为它们正在HTML中显示。所以问题必须在准备好的陈述中。问题是,我看不出声明本身的任何错误。当我查询表本身时,那里没有数据。
数据库连接功能正常,因为我可以使用硬编码语句将值插入数据库,而不是准备好的语句。
以下是我使用的声明。任何建议都非常感谢。
public void addRegisterDetails(String name, String email, String country, String password, ){
try{
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver).newInstance();
// Make db connection
con = DriverManager.getConnection(url, USERNAME, PASSWORD);
st = con.createStatement();
String query = " INSERT INTO user_information (name, email, country, password)" + " VALUES (?, ?, ?, ?)";
PreparedStatement preparedStmt = con.prepareStatement(query);
preparedStmt.setString (1, name);
preparedStmt.setString (2, email);
preparedStmt.setString (3, country);
preparedStmt.setString (4, password);
preparedStmt.execute();
}catch(ClassNotFoundException ex) {
System.out.println(ex);
}catch(Exception e){
e.printStackTrace();
}
}
表格定义
除了id之外的所有VARCHAR,类型为INT。
答案 0 :(得分:4)
您应该在语句对象上调用方法executeUpdate()
。
另外,我没有看到任何调用提交数据,任何事务处理。如果你为了这个问题而跳过那段代码就没关系了;否则这是一个非常重要的步骤(如果一切顺利,则提交,异常情况的回滚)
答案 1 :(得分:2)
使用executeUpdate
进行数据库写操作:
preparedStmt.executeUpdate();
答案 2 :(得分:1)
答案:数据库ID未设置为自动增量。由于某种原因,这不允许您随后将数据插入表。感谢ChadNC指出这一点。
答案 3 :(得分:0)
另外,为什么st = con.createStatement();
?
为什么你的查询中有一个领先的空间?
String query = " INSERT INTO user_information (name, email, country, password)"
+ " VALUES (?, ?, ?, ?)";
这个领先的空间可能也可能不重要......
最后,您应该在使用try-with-resources或finally块时关闭连接。