2010-11-19 46 views
62

,一些JDBC驅動程序返回Statement.RETURN_GENERATED_KEYS唯一的辦法就是做以下的事情:的PreparedStatement用是Statement.RETURN_GENERATED_KEYS

long key = -1L; 
Statement statement = connection.createStatement(); 
statement.executeUpdate(YOUR_SQL_HERE, Statement.RETURN_GENERATED_KEYS); 
ResultSet rs = statement.getGeneratedKeys(); 
if (rs != null && rs.next()) { 
    key = rs.getLong(1); 
} 

有沒有辦法做同樣與PreparedStatement


編輯

我問我是否可以做同樣的PreparedStatement原因考慮以下情形:

private static final String SQL_CREATE = 
      "INSERT INTO 
      USER(FIRST_NAME, MIDDLE_NAME, LAST_NAME, EMAIL_ADDRESS, DOB) 
      VALUES (?, ?, ?, ?, ?)"; 

USER表中有一個PRIMARY KEY (USER_ID)這是一個BIGINT AUTOINCREMENT(因此爲什麼你在SQL_CREATE String中看不到它。

現在,我使用PreparedStatement.setXXXX(index, value)填充?。我想返回ResultSet rs = PreparedStatement.getGeneratedKeys()。我怎樣才能做到這一點?

您是否嘗試過這樣的:由於沒有通過我一個編譯器

+2

很多人誤解和利用PreparedStatement#的executeUpdate(ARG)。 Java doc說'這個帶參數的方法不能在PreparedStatement或CallableStatement上調用。這意味着我們必須使用不帶參數的executeUpdate(),即使'PrepaUpStatement類中可以繼承'executeUpdate(arg)'方法但我們沒有使用它,否則我們會得到SQLException。 – AmitG 2015-01-08 17:33:46

回答

107

您可以使用prepareStatement方法採取額外int參數

PreparedStatement ps = con.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS) 

對於某些JDBC驅動程序(例如Oracle),你必須明確列出生成的密鑰的列名或指數:

PreparedStatement ps = con.prepareStatement(sql, new String[]{"USER_ID"}) 
+0

我已經接受了您的答案,因爲您已經展示了更多方法來實現相同的結果。 – 2010-11-19 12:13:51

8

現在,我會問一個問題回答呢?它工作嗎?

long key = -1L; 
PreparedStatement statement = connection.prepareStatement(); 
statement.executeUpdate(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS); 
ResultSet rs = statement.getGeneratedKeys(); 
if (rs != null && rs.next()) { 
    key = rs.getLong(1); 
} 

聲明:顯然,我沒有編譯這個,但你明白了。

PreparedStatementStatement的子接口,所以我沒有看到爲什麼這不起作用的原因,除非某些JDBC驅動程序有問題。

+0

這不是我正在尋找的我知道'PreparedStatement'是'Statement'的子類... ....查看我更新的帖子。 – 2010-11-19 11:20:54

52

你的意思是這樣的嗎?

long key = -1L; 

PreparedStatement preparedStatement = connection.prepareStatement(YOUR_SQL_HERE, PreparedStatement.RETURN_GENERATED_KEYS); 
preparedStatement.setXXX(index, VALUE); 
preparedStatement.executeUpdate(); 

ResultSet rs = preparedStatement.getGeneratedKeys(); 

if (rs.next()) { 
    key = rs.getLong(1); 
} 
+0

賓果......我看不到它。謝謝! – 2010-11-19 12:10:14

+0

生成的鍵結果集如何可以爲空? – 2016-04-10 17:02:59

0
private void alarmEventInsert(DriveDetail driveDetail, String vehicleRegNo, int organizationId) { 

    final String ALARM_EVENT_INS_SQL = "INSERT INTO alarm_event (event_code,param1,param2,org_id,created_time) VALUES (?,?,?,?,?)"; 
    CachedConnection conn = JDatabaseManager.getConnection(); 
    PreparedStatement ps = null; 
    ResultSet generatedKeys = null; 
    try { 
     ps = conn.prepareStatement(ALARM_EVENT_INS_SQL, ps.RETURN_GENERATED_KEYS); 
     ps.setInt(1, driveDetail.getEventCode()); 
     ps.setString(2, vehicleRegNo); 
     ps.setString(3, null); 
     ps.setInt(4, organizationId); 
     ps.setString(5, driveDetail.getCreateTime()); 
     ps.execute(); 
     generatedKeys = ps.getGeneratedKeys(); 
     if (generatedKeys.next()) { 
      driveDetail.setStopDuration(generatedKeys.getInt(1)); 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
     logger.error("Error inserting into alarm_event : {}", e 
       .getMessage()); 
     logger.info(ps.toString()); 
    } finally { 
     if (ps != null) { 
      try { 

       if (ps != null) 
        ps.close(); 
      } catch (SQLException e) { 
       logger.error("Error closing prepared statements : {}", e 
         .getMessage()); 
      } 
     } 
    } 
    JDatabaseManager.freeConnection(conn); 
} 
+1

難道你不應該在finally塊中釋放你的連接,而不是在它之外(如果你得到任何類型的運行時異常,你會韭菜一個連接)? – Jules 2013-10-23 22:21:06

+0

@niraj - 而不是ps.RETURN_GENERATED_KEYS,我們可以編寫Statement.RETURN_GENERATED_KEYS,因爲它是java.sql.Statement類中的靜態變量。 – AmitG 2015-01-08 16:24:19

0
String query = "INSERT INTO ...."; 
PreparedStatement preparedStatement = connection.prepareStatement(query, PreparedStatement.RETURN_GENERATED_KEYS); 

preparedStatement.setXXX(1, VALUE); 
preparedStatement.setXXX(2, VALUE); 
.... 
preparedStatement.executeUpdate(); 

ResultSet rs = preparedStatement.getGeneratedKeys(); 
int key = rs.next() ? rs.getInt(1) : 0; 

if(key!=0){ 
    System.out.println("Generated key="+key); 
} 
+0

如果生成了密鑰,則輸入密鑰,否則如果不生成則輸入密鑰= 0 – 2017-08-19 05:04:21