JDBC insert后得到主键的方式

使用JDBC,或者通过hibernate,mybatis等orm框架,执行insert语句,要怎么得到新生成记录的主键呢?

大体有两种方式,1. 在执行insert前,生成主键,那么主键和普通的列就没有区别,2. 执行insert后,通过某种方式得到新生成的主键;严格的说,还有第三种方式,没有主键;

对于第一种方式,常见的是使用oracle的sequence,在执行insert前,通过select <seq>.nextval from dual 得到主键;或者使用UUID的方式,或者其他可以保证唯一主键的方式,生成主键,作为普通的一列数据插入数据库;

在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>

或者使用sequence

<id name="id" type="long" column="person_id">
        <generator class="sequence">
                <param name="sequence">person_id_sequence</param>
        </generator>
</id>

在mybatis中,可以使用 selectKey设置

<selectKey
  keyProperty="id"
  resultType="int"
  order="BEFORE"
  statementType="PREPARED">

第二种方式,一般用于mysql auto increment key,或者 (oracle) insert into xxx (id, ...) values (<seq>.nextval, ...);

如果使用这种方式,大体的策略就是insert完以后,通过select获得主键,不同的数据库有不同的方式

oracle:

insert into mytable (...) values (...)returning id into v_id;

这个只能用于pl/sql; 

或者使用

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
}
时间: 2024-08-07 17:01:41

JDBC insert后得到主键的方式的相关文章

MyBatis :Insert (返回主键、批量插入)

一.前言    数据库操作怎能少了INSERT操作呢?下面记录MyBatis关于INSERT操作的笔记,以便日后查阅. 二.insert元素 属性详解   其属性如下: parameterType ,入参的全限定类名或类型别名 keyColumn ,设置数据表自动生成的主键名.对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置 keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪

Mybatis 插入数据后返回主键值

Oracle中获取刚刚插入记录的主键值: <insert id="insertSelective" parameterType="com.jxxx.p2pp.model.UUserInfo">     <selectKey resultType="java.math.BigDecimal" order="BEFORE" keyProperty="id">    SELECT U_US

MyBatis insert操作返回主键

在写毕业设计的时候总是发现有一些小的细节问题,比如说...... MyBatis insert操作后怎么返回主键? 原来不懂的时候是调用一个select语句,将刚刚insert的对象再传入进去查出主键,但是这么写主键就没有意义了,什么都可以放到数据库里面去查. 在说,这样也会引起很多其他的问题.比如说你要查一下post表,在你不知道post_id的情况下你利用了post_name去查询post对象. 万一post_name有重复的呢?怎么办?所以有了这篇博客. 网上有很多大神写了很多mybati

hibernate mapping 主键配置方式

1. 主键(id) Hibernate的主键生成策略有如下几种: 1)  assigned 主键由外部程序负责生成,在 save() 之前指定. 2)  hilo 通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源. 3)  seqhilo 与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle. 4)  increment 主键按数值顺序递增.此方式的实现机制为在当前应用实例

sql新增后返回主键

对于刚学的人来说有点帮助,新增后返回主键有两种方法: 1,返回自增的主键: 1 INSERT INTO 表名 2 (字段名1,字段名2,字段名3,…) 3 VALUES 4 (值1,值2,值3,…) 5 SELECT @@IDENTITY 2,返回主键也可以返回别的字段看需要:inserted.id这里的id可以是其他字段就是一个字段名,比如还可以返回inserted.name 1 INSERT INTO 表名 2 (字段名1,…) 3 OUTPUT inserted.id 4 VALUES 5

xorm插入数据库后返回主键自增id

golang使用xorm连接数据库后,插入结构体,无法返回自增主键id,饭后的主键id都是0.经过研究发现,如果给结构体id设置xorm tag,则会默认id为0,不会返回插入成功后的主键id. xorm文档中如下描述 1 package main 2 3 import ( 4 "fmt" 5 "time" 6 7 _ "github.com/go-sql-driver/mysql" 8 "github.com/go-xorm/xorm

Mybatis中insert中返回主键ID的方法

1.XyzMapper.xml <insertid="doSomething"parameterType="map"useGeneratedKeys="true"keyProperty="yourId"> ... </insert> 或 <insert id="doSomething" parameterType="com.xx.yy.zz.YourClass&quo

java mybatis中insert 操作 返回主键的小技巧。。。。

第一种方式: 在实体类的映射文件 "*Mapper.xml" 这样写: <insert id="insertvmatedic" keyColumn="mdid" useGeneratedKeys="true" keyProperty="mdid" parameterType="Vmaterialdictionary"> insert into vmaterialdiction

mybatis中useGeneratedKeys用法--插入数据库后获取主键值

前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录    在项目中经常需要获取到插入数据的主键来保障后续操作,数据库中主键一般我们使用自增或者uuid()的方式自动生成 问题:对于uuid使用Java代码生成的方式还比较容易控制,然而使用数据库生成的主键,这样我们就需要将插入的数据再查询出来得到主键,某些情况下还可能查询到多条情况,这样就比较尴尬了. 那有什么办法来插入数据