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
}
相关文章
相关标签/搜索