SQL占位符不会绑定

时间:2013-06-27 13:57:36

标签: java web-applications stripes

我只需要第二眼就可以了,因为我无法看到错误。插入不起作用,我看不出原因。这是一个家庭作业。适用的代码位于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中时插入工作正常,但在将值绑定到语句时它不起作用。

2 个答案:

答案 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并插入记录。