使用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 }