使用JDBC,或者經過hibernate,mybatis等orm框架,執行insert語句,要怎麼獲得新生成記錄的主鍵呢?node
大致有兩種方式,1. 在執行insert前,生成主鍵,那麼主鍵和普通的列就沒有區別,2. 執行insert後,經過某種方式獲得新生成的主鍵;嚴格的說,還有第三種方式,沒有主鍵;mysql
對於第一種方式,常見的是使用oracle的sequence,在執行insert前,經過select <seq>.nextval from dual 獲得主鍵;或者使用UUID的方式,或者其餘能夠保證惟一主鍵的方式,生成主鍵,做爲普通的一列數據插入數據庫;sql
在hibernate中,能夠使用以下的方式配置一個genrator:數據庫
<id name="propertyName" type="typename" column="column_name" unsaved-value="null|any|none|undefined|id_value" access="field|property|ClassName"> node="element-name|@attribute-name|element/@attribute|." <generator class="generatorClass"/> </id>
或者使用sequenceapi
<id name="id" type="long" column="person_id"> <generator class="sequence"> <param name="sequence">person_id_sequence</param> </generator> </id>
在mybatis中,能夠使用 selectKey設置session
<selectKey keyProperty="id" resultType="int" order="BEFORE" statementType="PREPARED">
第二種方式,通常用於mysql auto increment key,或者 (oracle) insert into xxx (id, ...) values (<seq>.nextval, ...);mybatis
若是使用這種方式,大致的策略就是insert完之後,經過select得到主鍵,不一樣的數據庫有不一樣的方式oracle
oracle:框架
insert into mytable (...) values (...)returning id into v_id;
這個只能用於pl/sql; hibernate
或者使用
select <seq>.currval from dual;
這個方式我本身沒有用過,網上搜索了一下,在同一個session裏面,使用同一個connection,能夠保證currval就是剛剛使用的sequence。有機會實驗一下,再回來更新;
mysql:
select last_insert_id()
sql server:
SELECT SCOPE_IDENTITY()
若是使用mybatis,一樣能夠經過selectKey獲得主鍵,不過別忘了把order設置爲after
<selectKey resultType="long" order="AFTER" keyProperty="returnedId"> SELECT LAST_INSERT_ID() as returnedId </selectKey>
若是使用mysql auto increment相似的自動主鍵生成策略,jdbc提供了以下的api,執行insert時,獲得主鍵:
int autoIncKeyFromApi = -1; stmt.executeUpdate(insert, Statement.RETURN_GENERATED_KEYS); rs = stmt.getGeneratedKeys(); if (rs.next()) { autoIncKeyFromApi = rs.getInt(1); } else { // do what you have to do }