3 回答

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
如果它是自動(dòng)生成的密鑰,則可以使用Statement#getGeneratedKeys()
為了這個(gè)。你需要用同樣的方式來稱呼它Statement
作為被用于INSERT
..你先需要若要?jiǎng)?chuàng)建語句,請(qǐng)使用Statement.RETURN_GENERATED_KEYS
通知JDBC驅(qū)動(dòng)程序返回密鑰。
下面是一個(gè)基本的例子:
public?void?create(User?user)?throws?SQLException?{ ????try?( ????????Connection?connection?=?dataSource.getConnection(); ????????PreparedStatement?statement?=?connection.prepareStatement(SQL_INSERT, ??????????????????????????????????????Statement.RETURN_GENERATED_KEYS); ????)?{ ????????statement.setString(1,?user.getName()); ????????statement.setString(2,?user.getPassword()); ????????statement.setString(3,?user.getEmail()); ????????//?... ????????int?affectedRows?=?statement.executeUpdate(); ????????if?(affectedRows?==?0)?{ ????????????throw?new?SQLException("Creating?user?failed,?no?rows?affected."); ????????} ????????try?(ResultSet?generatedKeys?=?statement.getGeneratedKeys())?{ ????????????if?(generatedKeys.next())?{ ????????????????user.setId(generatedKeys.getLong(1)); ????????????} ????????????else?{ ????????????????throw?new?SQLException("Creating?user?failed,?no?ID?obtained."); ????????????} ????????} ????}}
請(qǐng)注意,您依賴于JDBC驅(qū)動(dòng)程序來確定它是否工作。目前,大多數(shù)最后的版本都可以工作,但如果我是正確的,Oracle JDBC驅(qū)動(dòng)程序在這方面仍然有些麻煩。MySQL和DB2已經(jīng)支持它很久了。PostgreSQL不久前開始支持它。我不能評(píng)論MSSQL,因?yàn)槲覐奈词褂眠^它。
對(duì)于Oracle,可以調(diào)用CallableStatement
帶著RETURNING
條款或aSELECT CURRVAL(sequencename)
(或執(zhí)行此操作的任何特定于DB的語法)INSERT
在同一事務(wù)中獲取最后生成的密鑰。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
創(chuàng)建生成列 String generatedColumns[] = { "ID" };
將此遺傳列傳遞給您的語句 PreparedStatement stmtInsert = conn.prepareStatement(insertSQL, generatedColumns);
使用 ResultSet
對(duì)象獲取GeneratedKeys on語句。 ResultSet rs = stmtInsert.getGeneratedKeys();if (rs.next()) { long id = rs.getLong(1); System.out.println("Inserted ID -" + id); // display inserted record}
添加回答
舉報(bào)