SQLException:executeQuery方法不能用于更新

时间:2013-04-15 02:37:34

标签: java mysql sql servlets

我正在尝试使用java servlet类将从注册表单中获取的用户信息插入到Derby DB中。

在用户点击提交按钮并填写用户信息后,我立即连接到NetBeans上的数据库。然后它应该运行这个方法:

public void insertNewUser(String userName, String passWord, String lastName, String firstName, String age, char sex, String email) {
    try {
        stmt = conn.createStatement();
        String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES ('" + userName + "', '" + passWord + "', '" + lastName + "', '" + firstName + "', " + age + ", '" + sex + "', '" + email + "')";
        System.out.println(insertNewUserSQL);
        stmt.executeQuery(insertNewUserSQL);
        stmt.close();
    } catch(SQLException sqlExcept) {
        sqlExcept.printStackTrace();
    }
}

但我一直得到以下例外:

java.sql.SQLException: executeQuery method can not be used for update.

这究竟意味着什么?

SQL命令是正确的,因为我可以在NetBeans SQL命令窗口中手动执行。

是否存在对servlet或我不了解的内容的限制?

提前致谢!

2 个答案:

答案 0 :(得分:22)

由于您要插入记录,因此您应该使用executeUpdate()而不是executeQuery()

以下是一些通常被滥用的方法:


boolean execute()

  

执行此PreparedStatement对象中的SQL语句,可以执行此操作   是任何一种SQL语句。

ResultSet executeQuery()

  

在此PreparedStatement对象中执行SQL查询并返回   查询生成的ResultSet对象。

int executeUpdate()

  

在此PreparedStatement对象中执行SQL语句   必须是SQL INSERT,UPDATE或DELETE语句;或SQL语句   什么都不返回,比如DDL语句。


还有一件事,您的查询很弱,因为SQL Injection容易受到攻击。请使用PreparedStatement进行参数化。

示例代码段:

String insertNewUserSQL = "INSERT INTO " + studentsTable + " VALUES (?, ?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(insertNewUserSQL);
pstmt.setString(1, userName);
// ... repeat this step until the last parameter ....
pstmt.setString(7, email);
pstmt.executeUpdate();

答案 1 :(得分:1)

要更新值,您需要使用可更新的ResultSet,如下所示:

ResultSet res = preparedStatement.executeQuery(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
res.first();
res.updateInt("id", 2);
res.updateRow();

或者,您可以使用语句的executeUpdate方法,如下所示: statement.executeUpdate("update table set id = 2");