`
wb284551926
  • 浏览: 538749 次
文章分类
社区版块
存档分类
最新评论

利用JDBC获取新插入记录id主键的三种方法(转载)

 
阅读更多
在一对多的关联操作中,通常在一方插入记录后,需要获取到当前记录的id,以方便进行多方的插入操作。要解决这一问题,在JDBC中至少有三种不同的实现方法:
1.在插入语句后添加一条查询,利用resultset来得到id号
psmt = con.prepareStatement
            ("insert into orders (receiver,address,telephone,total,detailnum,userid)values(?,?,?,?,?,?);select

@@identity");
            psmt.setString(1, order.getReceiver());
            ……
            results = psmt.executeQuery();
            if(results.next())
            {
                num = results.getInt(1);
            }
2.利用generatedKey来获取id
psmt = con.prepareStatement
            ("insert into orders (receiver,address,telephone,total,detailnum,userid)values

(?,?,?,?,?,?)",Statement.RETURN_GENERATED_KEYS);
            psmt.setString(1, order.getReceiver());
            ……
            psmt.executeUpdate();
            results = psmt.getGeneratedKeys();
            int num = -1;
            if(results.next())
            {
                num = results.getInt(1);
            }

3.调用存储过程来实现,当然这种情况下,插入对象的属性不宜过多,否则存储过程的输入参数太多。在存储过程中,将id作为输出参数返回
CallableStatement proc = conn.prepareCall("{call proc_insert(?,?,?)}");
            proc.setString(1, cardname);
            proc.setInt(2, money);
            proc.registerOutParameter(3, Types.INTEGER);
            proc.execute();
            num = proc.getInt(3)

开始用第一种方法,什么set nocount on都用到了,就是不能解决问题,最后用第二种方法成功解决。

PS:
SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 IDENTITY 列中的值。
 IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
     @@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
     SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
 
貌似SCOPE_IDENTITY 比 @@IDENTITY更加安全。
原文地址:http://blog.sina.com.cn/s/blog_4b5bc01101019vc3.html
分享到:
评论

相关推荐

    java使用jdbc插入信息时获取id1

    // 设置成可以获取主键 preparedStatement = connection.prepareStatement(sql, Statement.RE

    mysql的插入问题 怎么获得自动增长的ID

    学习mysql必看的东西 一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql...还是MYSQL的,一张表有还是有ID自增主键,用JDBC insert一条语句之内,怎么在JAVA程序里面获得这条记录的ID.

    jdbc基础和参考

    Hibernate中对象的三种状态: Transient(瞬态): 1.由new关键字创建 2.没有和Session进行关联的 3.数据库中没有对应的记录存在 4.操作不会影响数据库中的数据 Persistent(持久态): 1.和Session之间有关联 2.在...

    在Spring中用select last_insert_id()时遇到问题

    今天在使用MySQL时却不知如何处理,插入记录后不知怎样获得刚刚插入的id,查过文档后发现了select last_insert_id(),在插入之后执行此查询,即可获得自增id,喜出望外。可用到自己的程序中之后却得不到想要的结果,...

    Hibernate注解

    * allocationSize 每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50. * @GenericGenerator —— 注解声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性 * name ...

    问卷调查系统.rar

    id(主键) user_id(外键:用户) ans_date(调查时间) 调查分类(值为 : 1班主任,2教员). 4.tb_ans问卷记录详情信息: a1-a10 10个选项对应的分值. id(主键) que_id(外键: 问卷编号) a1 a2 a3 ~ a10 advance(建议,文本...

    springmybatis

    请注意,这里面有一个方法名 selectUserByID 必须与 User.xml 里面配置的 select 的id 对应(<select id="selectUserByID") 重写测试代码 程序代码 程序代码 public static void main(String[] args) { ...

    JdbcTemplateTool.zip

    可以直接把一个PO类存到数据库通过PO类和一个id可以获取到该对象通过PO类可以直接update数据库记录不需要实现 BatchPreparedStatementSetter, 就可以批量update通过一个对PO对象删除对应的数据库记录依然可以使用...

    VereORM至简持久层微架构

    -- 表的主键 id 1.assign 手动设置 2.auto_increment 数据库自动增加 --> 8.在 test/src 中新建一个 测试类 com.test.orm.Test package com.test.orm; import com.test.entity.User; import ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    随着博客人数的增加, Blog 作为一种新的生活方式、新的工作方式、新的学习方式已经被越来越多的人所接受,并且在改变传统的网络和社会结构:网络信息不再是虚假不可验证的,交流和沟通更有明确的选择和方向性,单一...

    软件工程工资管理系统

    本系统采用B+树索引方法,分别在各Customer,Diretory,Order和OrderDetail各个表的主键上建立索引。 5.2数据存放位置 本系统数据和索引存放在磁盘中。 5.3确定系统配置 根据具体需要配置。 6.数据库实施 6.1数据库...

    hibernate 体系结构与配置 参考文档(html)

    三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用...

    Hibernate参考文档

    9.1. 三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用...

    Hibernate 中文 html 帮助文档

    9.1. 三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用...

    最全Hibernate 参考文档

    9.1. 三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用...

    Hibernate3+中文参考文档

    9.1. 三种策略 9.1.1. 每个类分层结构一张表(Table per class hierarchy) 9.1.2. 每个子类一张表(Table per subclass) 9.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 9.1.4. 混合使用...

    hibernate 框架详解

    三种策略 10.1.1. 每个类分层结构一张表(Table per class hierarchy) 10.1.2. 每个子类一张表(Table per subclass) 10.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 10.1.4. 混合...

    hibernate3.04中文文档.chm

    10.1. 三种策略 10.1.1. 每个类分层结构一张表(Table per class hierarchy) 10.1.2. 每个子类一张表(Table per subclass) 10.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 10.1.4. ...

    Hibernate教程

    10.1. 三种策略 10.1.1. 每个类分层结构一张表(Table per class hierarchy) 10.1.2. 每个子类一张表(Table per subclass) 10.1.3. 每个子类一张表(Table per subclass),使用辨别标志(Discriminator) 10.1.4. ...

Global site tag (gtag.js) - Google Analytics