JDBC insert後獲得主鍵的方式

使用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
}
相關文章
相關標籤/搜索