注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

红尘若梦

生活的色彩

 
 
 

日志

 
 

利用JDBC获取新插入记录id的三种方法  

2015-12-16 14:46:42|  分类: 技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
很多JAVA程序在插入记录后,需要获取到当前插入记录的id,以方便之后进行其它操作。而要解决这一问题,在JDBC中至少有三种不同的实现方法:
1)在执行完SQL语句后,调用select @@identity。@@identity 是当前连接的全局变量,只对当前连接有效。也就是说,如果断开连接再重新连接后,@@IDENTITY 为 null。

PreparedStatement pstmt = con.prepareStatement("INSERT INTO `site`(`name`,`url`)VALUES('我就上乐乐吧','http://593668.com')");
pstmt.executeUpdate();
//执行SQL后,立马再取插入的ID
pstmt = con.prepareStatement("select @@identity");
ResultSet rs=pstmt.executeQuery();
//默认插入ID设置为0
int num="0";
if(rs.next())num = rs.getInt(1);

2)使用 PreparedStatement.RETURN_GENERATED_KEYS 获取刚刚插入语句的ID值

PreparedStatement pstmt = con.prepareStatement("INSERT INTO `site`(`name`,`url`)VALUES('我就上乐乐吧','http://593668.com')",Statement.RETURN_GENERATED_KEYS);
pstmt.executeUpdate();
//执行SQL后,立马再取插入的ID
ResultSet rs=pstmt.getGeneratedKeys();
//默认插入ID设置为0
int num="0";
if(rs.next())num = rs.getInt(1);

3)调用存储过程来实现,这种情况下,插入对象的属性不宜过多,否则存储过程的输入参数太多,影响效率。在存储过程中执行后将插入id作为输出参数返回。

//proc_insert存储过程请先定义好
CallableStatement proc = conn.prepareCall("{call proc_insert(?,?,?)}");
proc.setString(1, "我就上乐乐吧");
proc.setString(2, "http://593668.com");
proc.registerOutParameter(3, Types.INTEGER);
proc.execute();
//获取插入ID
int num =proc.getInt(3)

下面是以MYSQL为例的存储过程例子:

CREATE
PROCEDURE `proc_insert`(IN name VARCHAR(50),IN url VARCHAR(50),OUT num INT)
BEGIN
SET @Sql = concat('insert into `site`(`name`,`url`) VALUES("',name, '","',url,'")');
PREPARE stmt_p from @Sql;
EXECUTE stmt_p;
SELECT @@IDENTITY INTO @num;
END

总体而言,第二种方法最简单【推荐】,第一种在遇到多线程时可能会有错误,第三种则是基于第一种的,参数过多的话效率不高。
  评论这张
 
阅读(55)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017