我只需要第二眼就可以了,因为我无法看到错误。插入不起作用,我看不出原因。这是一个家庭作业。适用的代码位于CustomerDAO类中。这是使用Stripes框架使用Java构建的webapp。这是违规代码:
public void create(Customer customer) {
String sql = "insert into customer (`firstname`, `lastname`, `email`, " +
"`username`, `password`) values (?, ?, ?, ?, ?)";
try {
PreparedStatement sth = this.dbh.getCon().prepareStatement(sql);
sth.setString(1, customer.getFirstName());
sth.setString(2, customer.getLastName());
sth.setString(3, customer.getEmailAddress());
sth.setString(4, customer.getUserName());
sth.setString(5, customer.getPassword());
sth.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();;
} catch (NullPointerException ex) {
ex.printStackTrace();
} finally {
this.dbh.closeConnection();
}
}
正如我所说,这种方法存在于我的DAO中。从注册表单的操作bean调用此方法。以下是我测试的内容:
客户对象不为空。客户字段从表单中获取其值并且它们是正确的。 DAO不为空。数据库已连接。
我通过测试Action Bean中的条件来检查上面的项目,如果条件为真则返回null,否则我返回RedirectResolution。
我确实注释掉了将变量绑定到SQL的五行,并用我想插入的实际数据替换了SQL中的变量,并且记录插入了。这就是为什么我认为问题出现在这五行中的原因:
sth.setString(1, customer.getFirstName());
sth.setString(2, customer.getLastName());
sth.setString(3, customer.getEmailAddress());
sth.setString(4, customer.getUserName());
sth.setString(5, customer.getPassword());
当我在动作bean中使用这个if语句时,我被重定向到一个完全空的页面,这就是我知道这些值绑定到模型的字段的方式。
if (this.customer.getFirstName().equals("Tony")) {
return null;
}
以下是action bean的提交方法:
public Resolution submit() {
this.customer = this.getCustomer();
this.customerDao = this.getCustomerDao();
this.customerDao.create(customer);
return new RedirectResolution(RegisterFormActionBean.class);
}
字段值的测试已插入this.customer = this.getCustomer();
下。我在所有表单字段上独立运行该测试,并始终转发到空白页面。当这个运行时,我被重定向回注册页面,但没有插入记录。我检查了文档以确保setString()
方法是正确的,它似乎是。
我知道这可能是我所忽视的傻事,但我只是在这里转动轮子。
实际问题:为什么在将值硬编码到SQL中时插入工作正常,但在将值绑定到语句时它不起作用。
答案 0 :(得分:0)
也许您的交易未被自动提交。验证dbh对象如何创建连接,并查看它们是否禁用自动提交。尝试启用自动提交:
Connection myConnection = this.dbh.getCon();
myConnection.setAutoCommit(true);
myConnection.prepareStatement(sql);
有关详细信息,请参阅http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html。
答案 1 :(得分:0)
我明白了。在预感时,我将数据库表更改为接受NULL,但id字段除外。当我再次运行它时,插入了记录,我看到'password'
字段为NULL。我在register.jsp页面上有两个密码输入,都是'password'
。显然Stripes不知道如果你在同一个表单上有重复的名字该怎么办,我以为会覆盖另一个。我将其中一个文本框重命名为""
,并将数据库表更改回不允许NULL
并插入记录。