yxhxj2006
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2012年9月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
留言簿
(7)
给我留言
查看公开留言
查看私人留言
随笔分类
J2EE(17)
(rss)
java(13)
(rss)
Javascipt
(rss)
Linux(3)
(rss)
PHP(4)
(rss)
SQL(12)
(rss)
励志(3)
(rss)
测试
(rss)
文章分类
paypal
(rss)
随笔档案
2016年6月 (1)
2015年12月 (1)
2015年11月 (1)
2015年10月 (1)
2015年8月 (1)
2015年6月 (1)
2015年5月 (3)
2015年4月 (6)
2015年3月 (1)
2015年2月 (4)
2015年1月 (4)
2014年12月 (6)
2014年11月 (1)
2014年9月 (3)
2014年6月 (2)
2014年5月 (5)
2014年4月 (3)
2014年3月 (3)
2014年2月 (15)
2014年1月 (11)
2013年12月 (1)
2013年11月 (8)
2013年10月 (6)
2013年9月 (2)
2013年8月 (19)
2013年7月 (1)
2013年6月 (1)
2013年5月 (3)
2013年4月 (3)
2013年3月 (5)
2012年12月 (3)
2012年11月 (4)
2012年10月 (1)
2012年9月 (25)
2012年8月 (54)
2012年7月 (10)
2012年6月 (7)
阅读排行榜
1. Hibernate实现有两种配置,xml配置与注释配置(49832)
2. 公钥与私钥 (42304)
3. 使用POI读取EXCEL中的所有Sheet表 (25882)
4. Maven实战(六)依赖(11931)
5. Oracle中把一个查询结果插入到一张表中(11018)
评论排行榜
1. 公钥与私钥 (31)
2. Hibernate实现有两种配置,xml配置与注释配置(4)
3. Java通过URL获取网站Html源代码 (3)
4. 让HTML中的文本框中的文字垂直居中 .(3)
5. struts2表单传值(2)
常用链接
我的随笔
我的评论
我的参与
最新评论
统计
随笔 - 228
文章 - 0
评论 - 53
引用 - 0
最新评论
1. re: 公钥与私钥
评论内容较长,点击标题查看
--chinaltang
2. re: 如何在magento中建立自定义页面
请问站长,你这个增加以下片段是在哪里增加的,还有你这是怎么显示出来页面呢,总要点击页面上的哪个东西跳转到这个页面吧,那点击跳转怎么操作
--王小丫
3. re: 公钥与私钥
343434
--zhangsa
4. re: 公钥与私钥
真的写的非常好,通俗易懂,但是不知道有demo没有,要是有求一份。
--Divella
5. re: Hibernate实现有两种配置,xml配置与注释配置[未登录]
sa
--sa
Java执行sql语句并获取指定返回值
当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用。我们通常的做法有如下几种:
1、先 select max(id) +1 ,然后将+1后的值作为主键插入数据库;
2、使用特定数据库的 auto_increment 特性,在插入数据完成后,使用 select max(id) 获取主键值;
3、对于Oracle,使用 sequence 获取值。
对于以上3种方法都无法绝对保证在高并发情况下的操作的原子性。
现记录以下几种获取数据库主键值方法:
1、数据库原生支持的sql方法:
SQLServer:
INSERT INTO table_name (.....) VALUES(......) SELECT @@IDENTITY AS aliasname;
上面的语句相当于查询语句,从结果集中使用 getXXX(aliasname) 方法获取主键值。
Oracle:
INSERT INTO table_name(......) VALUES(......) RETURNING[primaryKey INTO]:aliasname;
也是相当于查询语句,从结果集中使用 getXXX(aliasname) 方法获取主键值。
2、java.sql.Statement 返回键获取:
a: 使用JDBC 3.0提供的 getGeneratedKeys(推荐使用)
Statement stmt = ... ;
stmt.executeUpdate("INSERT INTO table_name(......) VALUES(......)", Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
int keyValue = -1;
if (rs.next()) {
keyValue = rs.getInt(1);
}
b:使用特定数据库特有的SQL
Statement stmt = ... ;
stmt.executeUpdate("INSERT INTO table_name(......) VALUES(......)", Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
int keyValue = -1;
if (rs.next()) {
keyValue = rs.getInt(1);
}
那么现在我就一个例子来看一下原生的sql怎么能得到执行的返回结果
项目背景:数据库是oracle数据库,id生成规则是通过触发器插入数据的时候自动增长,所以在插入数据的时候在sql中就不需要指明id值。但是另外一张表需要引用这个id值作为外键,那么就必须获得被引用的这个表的ID,为了避免并发问题,我们只能在插入前面那张表的时候就获得他的ID,所以我使用了下面的方法来处理。
Connection con = DBConnector.getconecttion(); // 取得一个数据库连接
CallableStatement cst = null;
con.setAutoCommit(false);
String insertSql = "begin insert into TABLE (field_0,field_1) values (value_0,value_1) returning id into ?;end; ";
try {
cst = con.prepareCall(insertSql); //执行存储过程
cst.registerOutParameter(1, Types.INTEGER); //为存储过程设定返回值
int count = cst.executeUpdate(); //得到预编译语句更新记录或删除操作的结果
int id = cst.getInt(1); //得到返回值
System.out.println("成功执行了:" + count + "条数据,其ID值:" + id);
} catch (SQLException e1) {
con.rollback();
con.setAutoCommit(true);
}finally{
con.commit();
con.close();
}
posted on 2012-09-20 00:50
奋斗成就男人
阅读(1271)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
Powered by:
BlogJava
Copyright © 奋斗成就男人