无法使用executeQuery()发出数据操作语句

时间:2011-06-23 13:16:25

标签: java mysql sql database jdbc

我使用com.mysql.jdbc.Driver

我需要插入并获取ID。 我的问题:

INSERT INTO Sessions(id_user) VALUES(1);
SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;

错误 -

  

无法发布数据操作   executeQuery()

的语句

如何插入并获取ID?

4 个答案:

答案 0 :(得分:20)

您需要使用executeUpdate()方法来执行INSERT语句,而您需要使用executeQuery()方法来执行SELECT语句。这是由于JDBC规范对其用法的要求:

来自Statement.executeQuery()的Java API文档:

  

执行给定的SQL语句,该语句返回单个ResultSet   对象

     

参数:

     

sql - 要发送到数据库的SQL语句,通常是静态SQL SELECT语句

以及Statement.executeUpdate()的Java API文档:

  

执行给定的SQL语句,该语句可以是INSERT,UPDATE或DELETE语句,也可以是不返回任何内容的SQL语句,例如SQL DDL语句。

     

参数:

     

sql - 一种 SQL数据操作语言(DML)语句,例如INSERT,UPDATE或DELETE;或不返回任何内容的SQL语句,例如DDL语句。

您的代码(此处发布的伪代码)应显示为:

statement.executeUpdate("INSERT INTO Sessions(id_user) VALUES(1)"); // DML operation
statement.executeQuery("SELECT LAST_INSERT_ID()"); // SELECT operation

当然还有MySQL documentation demonstrates how to perform the same activity for AUTO_INCREMENT columns,这显然是你需要的。

如果你需要在同一个事务中同时执行它们,可以在一个字符串中用分号提交语句,将它们分开,如下所示:

statement.execute("INSERT INTO Sessions(id_user) VALUES(1); SELECT LAST_INSERT_ID() FROM Sessions LIMIT 1;");

然后你需要使用execute()方法。请注意,这取决于数据库和JDBC驱动程序为单个execute()中的批处理语句提供的支持。这在Sybase和MSSQL Server中受支持,但我不认为MySQL支持它。

答案 1 :(得分:7)

可能是您正在使用executeQuery()但操作数据实际上需要executeUpdate()而不是executeQuery()

答案 2 :(得分:4)

    Connection connection = null;
    PreparedStatement preparedStatement = null;
    ResultSet generatedKeys = null;

    try {
        connection = m_Connection;
        preparedStatement = (PreparedStatement) connection.prepareStatement(qString, Statement.RETURN_GENERATED_KEYS);

        // ...

        int affectedRows = preparedStatement.executeUpdate();
        if (affectedRows == 0) {
            throw new SQLException("Creating user failed, no rows affected.");
        }

        generatedKeys = preparedStatement.getGeneratedKeys();
        int id = -1;
        if (generatedKeys.next()) {
            id = generatedKeys.getInt(1);
            id = -1;
        } else {
            throw new SQLException("Creating user failed, no generated key obtained.");
        }
    } finally {

    }

答案 3 :(得分:1)

对于非选择的SQL语句,请使用ExecuteNonQuery();

要获取最后插入的id,可以执行此SQL语句。

SELECT LAST_INSERT_ID() AS last_id

虽然可能有一个选择语句的java包装器。

链接:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
http://wiki.bibalex.org/JavaDoc/org/bibalex/daf/handlers/dbhandler/DBConnection.html