如何在java中执行复合sql查询?

如何执行以下查询并通过预准备语句检索结果:

INSERT INTO vcVisitors (sid) VALUES (?); SELECT LAST_INSERT_ID(); 

有没有办法一次执行这两个语句?

我试着做以下事情:

 Connection con = DbManager.getConnection(); PreparedStatement ps = con.PrepareStatement( "INSERT INTO vcVisitors (sid) VALUES (?); SELECT LAST_INSERT_ID();"); ps.setInt(1, 10); ResultSet rs = ps.exequteQuery(); rs.next(); return rs.getInt("LAST_INSERT_ID()"); 

但它给我一个错误,executeQuery无法执行这样的查询,我也尝试通过以下方式替换executeQuery:

 ps.execute(); rs = ps.getResultSet(); 

但它给了我SQL语法错误:

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT LAST_INSERT_ID()' at line 1 

但是执行查询“INSERT INTO vcVisitors(sid)VALUES(’10’); SELECT LAST_INSERT_ID();”没有问题 直接来自mysql控制台。

更新(插入)数据时使用executeUpdate而不是executeQuery 。 尝试执行SELECT LAST_INSERT_ID()作为另一个查询。

但它不是便携式查询。 我建议使用Statement.getGeneratedKeys 。 请看这里: JDBC(MySQL)检索AUTO_INCREMENT列值 。

以下是正确使用的LAST_INSERT_ID()示例:

  Statement stmt = null; ResultSet rs = null; try { // // Create a Statement instance that we can use for // 'normal' result sets. stmt = conn.createStatement(); // // Issue the DDL queries for the table for this example // stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial"); stmt.executeUpdate( "CREATE TABLE autoIncTutorial (" + "priKey INT NOT NULL AUTO_INCREMENT, " + "dataField VARCHAR(64), PRIMARY KEY (priKey))"); // // Insert one row that will generate an AUTO INCREMENT // key in the 'priKey' field // stmt.executeUpdate( "INSERT INTO autoIncTutorial (dataField) " + "values ('Can I Get the Auto Increment Field?')"); // // Use the MySQL LAST_INSERT_ID() // function to do the same thing as getGeneratedKeys() // int autoIncKeyFromFunc = -1; rs = stmt.executeQuery("SELECT LAST_INSERT_ID()"); if (rs.next()) { autoIncKeyFromFunc = rs.getInt(1); } else { // throw an exception from here } rs.close(); System.out.println("Key returned from " + "'SELECT LAST_INSERT_ID()': " + autoIncKeyFromFunc); } finally { if (rs != null) { try { rs.close(); } catch (SQLException ex) { // ignore } } if (stmt != null) { try { stmt.close(); } catch (SQLException ex) { // ignore } } } 

和getGeneratedKeys一样:

  Statement stmt = null; ResultSet rs = null; try { // // Create a Statement instance that we can use for // 'normal' result sets assuming you have a // Connection 'conn' to a MySQL database already // available stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_UPDATABLE); // // Issue the DDL queries for the table for this example // stmt.executeUpdate("DROP TABLE IF EXISTS autoIncTutorial"); stmt.executeUpdate( "CREATE TABLE autoIncTutorial (" + "priKey INT NOT NULL AUTO_INCREMENT, " + "dataField VARCHAR(64), PRIMARY KEY (priKey))"); // // Insert one row that will generate an AUTO INCREMENT // key in the 'priKey' field // stmt.executeUpdate( "INSERT INTO autoIncTutorial (dataField) " + "values ('Can I Get the Auto Increment Field?')", Statement.RETURN_GENERATED_KEYS); // // Example of using Statement.getGeneratedKeys() // to retrieve the value of an auto-increment // value // int autoIncKeyFromApi = -1; rs = stmt.getGeneratedKeys(); if (rs.next()) { autoIncKeyFromApi = rs.getInt(1); } else { // throw an exception from here } rs.close(); rs = null; System.out.println("Key returned from getGeneratedKeys():" + autoIncKeyFromApi); } finally { if (rs != null) { try { rs.close(); } catch (SQLException ex) { // ignore } } if (stmt != null) { try { stmt.close(); } catch (SQLException ex) { // ignore } } } 

正如其他人已经说过的那样,这是行不通的。 但看起来你只想得到最后一个插入的ID。 为此,您可以使用Statement类的getGeneratedKeys()方法。

试试:

 Connection con = DbManager.getConnection(); int lastid = 0; PreparedStatement psInsert = con.PrepareStatement( "INSERT INTO vcVisitors (sid) VALUES (?)"); psInsert.setInt(1, 10); psInsert.executeUpdate(); PreparedStatement psSelect = con.PrepareStatement("SELECT LAST_INSERT_ID() AS lastid"); ResultSet rs = psSelect.executeQuery(); rs.next(); lastid = rs.getInt("lastid"); rs.close(); psInsert.close(); psSelect.close(); con.close(); return lastid;