Java Prepared语句未执行

时间:2013-01-17 18:30:52

标签: java mysql database prepared-statement

我创建了一个小型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 |名字|电子邮件|国家|密码

除了id之外的所有VARCHAR,类型为INT。

4 个答案:

答案 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块时关闭连接。