0

我只需要再看一眼,因为我看不到错误。插入不起作用,我不明白为什么。这是一个家庭作业。适用的代码在 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;
}

下面是动作 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 中时插入工作但当我将值绑定到语句时它不起作用。

4

2 回答 2

0

也许您的事务没有被自动提交。验证您的 dbh 对象如何创建连接并查看它们是否禁用了自动提交。尝试启用自动提交:

Connection myConnection = this.dbh.getCon();
myConnection.setAutoCommit(true);
myConnection.prepareStatement(sql);

有关更多信息,请参阅http://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

于 2013-06-27T14:18:12.107 回答
0

我想到了。凭直觉,我将数据库表更改为接受 NULL,但 id 字段除外。当我再次运行它时,插入的记录我看到该'password'字段为 NULL。我在 register.jsp 页面上有两个密码输入,都命名为'password'. 显然,如果您在同一个表单上有重复的名称,Stripes 不知道该怎么办,我认为一个会覆盖另一个。我将其中一个文本框重命名为""并将数据库表更改回不允许NULL并插入记录。

于 2013-06-28T01:53:08.917 回答