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








====================================分割线================================



最新内容请见作者的GitHub页:http://qaseven.github.io/

目录
相关文章
|
20天前
|
Java
Java“缺少返回值”解决
在Java中,如果方法声明了返回类型,则必须确保所有可能的执行路径都返回一个值。解决“缺少返回值”问题的方法包括:使用默认返回值、抛出异常或确保所有条件分支都有返回值。
|
27天前
|
SQL 分布式计算 Java
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
31 3
|
2月前
|
SQL Java
使用java在未知表字段情况下通过sql查询信息
使用java在未知表字段情况下通过sql查询信息
31 1
|
3月前
|
SQL Java 数据库连接
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available
|
5月前
|
SQL 安全 Java
java的SQL注入与XSS攻击
java的SQL注入与XSS攻击
123 2
|
4月前
|
SQL Java 关系型数据库
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
Java面试题:描述JDBC的工作原理,包括连接数据库、执行SQL语句等步骤。
62 0
|
4月前
|
SQL 监控 Java
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
Java面试题:简述数据库性能优化的常见手段,如索引优化、SQL语句优化等。
285 0
|
4月前
|
SQL Java 数据库连接
【Java】已解决java.sql.SQLRecoverableException异常
【Java】已解决java.sql.SQLRecoverableException异常
455 0
|
4月前
|
SQL Java 数据库连接
【Java】已解决java.sql.SQLTimeoutException异常
【Java】已解决java.sql.SQLTimeoutException异常
86 0
|
4月前
|
SQL Java 数据库连接
【Java】已解决java.sql.SQLException异常
【Java】已解决java.sql.SQLException异常
504 0

热门文章

最新文章