Java执行sql语句并获取指定返回值

发表于:2012-6-07 09:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:axin66ok    来源:51Testing软件测试网采编

  当我们插入一条数据的时候,我们很多时候都想立刻获取当前插入的主键值返回以做它用。我们通常的做法有如下几种:

  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();
}

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号