搜索
首页数据库mysql教程如何得到JDBC Insert 语句执行后插入数据库记录的主键

http://blog.csdn.net/wwg2436/article/details/7638309 未作修改。 当插入一条记录时,我们很多时候都想马当前插入的主键返回出来. 别外.如果主键是自动生成的(大多数时候是这样),那么取回主键是一种比较困难的事. 可能对于一些特殊的数据库必须把insert int

http://blog.csdn.net/wwg2436/article/details/7638309

未作修改。

当插入一条记录时,我们很多时候都想马当前插入的主键返回出来.

别外.如果主键是自动生成的(大多数时候是这样),那么取回主键是一种比较困难的事.
可能对于一些特殊的数据库必须把insert into和select max(key)或什么序列当前值作为一个事务的原子来操作,但很多数据库(以及数据库操作环境)并不能为你提供事务并发控制.所以如果多人同时操作,那么select max(key)很可能就不是你刚才insert的那条记录.
在SQL server 很方便,有现程的sql可以用

INSERT INTO tableName (fieldList ...) values (valueList ...) SELECT @@IDENTITY AS aliasName;
在Oracle中,网上有多种方案,但是程序老是有问题。所以自己研究后,有两种方案:

1, 用JDBC的getGeneratedKeys,返回的是Oracle 的rowid.但是就是修改代码,比较麻烦,第一次返回rowid, 第二次再通过rowid再查一次数据库。

String sql = "insert into xx_cust(cust_type,cust_name,login_name)"
+ " values('ipn','aaa','bb')";
Connection conn = DBConnectionManager.getConnection();
PreparedStatement sta = conn.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
sta.execute();
System.out.println(sta.getGeneratedKeys());
ResultSet rest = sta.getGeneratedKeys();
rest.next();
String rowid=rest.getString(1);
System.out.println("rowid="+rowid);
PreparedStatement stat=conn.prepareStatement("select cust_id from xx_cust where rowid=?");
stat.setString(1, rowid);
ResultSet rest2 = stat.executeQuery();
rest2.next();
String custId=rest2.getString(1);
System.out.println("custid="+custId);
2,通过 用Oracle 的returning 语句
因为要用到oracle自己的API,所以如何用到像c3po等通用数据库连接池的话可以不能用。但是在数据库只连接一次。
代码如下:

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 
String url="jdbc:oracle:thin:@192.168.3.95:1521:tdm"; //orcl为数据库的SID 
String user="pesup"; 
String password="pesup"; 
Connection conn= DriverManager.getConnection(url,user,password);
String sql = "insert into xx_cust(cust_type,cust_name,login_name)"
+ " values('ipn','aaa','bb') returning cust_id into ?";
OraclePreparedStatement sta = (OraclePreparedStatement) conn
.prepareStatement(sql);
sta.registerReturnParameter(1, OracleTypes.INTEGER);
int count = sta.executeUpdate();
if (count > 0) {
ResultSet rset = sta.getReturnResultSet();
while (rset.next()) {
String name = rset.getString(1);
System.out.println("name=" + name);
}
}

----------------------------------------------------------------------------------------------

 

如何得到JDBC Insert 语句执行后插入Oracle 数据库记录的主键

在应用中,很多时候会对表的主键用一个自动增涨的数来付值,如Oracle的sequence,插入后又想得到的主键的值。下面介绍一下相关的方法。

1,用Oracle 的returning 语句。

PreparedStatement sta = conn.prepareStatement("INSERT INTO LOGGING VALUES (TESTSEQ.NEXTVAL,SYSDATE)returning id into ? ");

sta.execute();
ResultSet rset = sta.getResultSet();
while(rset.next())
{
int id = rset.getInt(1);
}
2,用JDBC的getGeneratedKeys,返回的是Oracle 的rowid.
PreparedStatement sta = conn.prepareStatement("INSERT INTO TESTTABLE VALUES (TESTSEQ.NEXTVAL,'aaaa')",Statement.RETURN_GENERATED_KEYS);
sta.execute();

System.out.println(sta.getGeneratedKeys());
ResultSet rest = sta.getGeneratedKeys();
rest.next();
//oracle rowid
System.out.println(rest.getString(1));

--------------------------------------------------------------------------------------------

获取自动生成的键值,int id primary key auto_increment;

Class.forName("com.mysql.jdbc.Driver");
   Connection conn = DriverManager
    .getConnection("jdbc:mysql://localhost/BBS?user=root&password=root");    //连接数据库
conn.setAutoCommit(false);       //不自动提交
  
String sql = "insert into article values (null,0,?,?,?,now(),0)";
PreparedStatement pstat = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);

//创建一个默认 PreparedStatement 对象,该对象能获取自动生成的键,适合insert语句

//(该语句能自动生成键值)autoGeneratedKeys - 指示是否应该返回自动生成的键的标志

//它是 Statement.RETURN_GENERATED_KEYS 或 Statement.NO_GENERATED_KEYS 之一

Statement stat = conn.createStatement();

pstat.setInt(1, -1);
pstat.setString(2,title);
pstat.setString(3,content);
pstat.executeUpdate();

ResultSet rsKey = pstat.getGeneratedKeys();      //ResultSet 指示键值
rsKey.next();
int key = rsKey.getInt(1);     //得到第一个键值
rsKey.close();
stat.executeUpdate("update article set rootid = " + key + " where id = " + key);

conn.commit();
conn.setAutoCommit(true);     //设回自动提交
pstat.close();
conn.close();

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Java8(291)之后禁用了TLS1.1使JDBC无法用SSL连接SqlServer2008怎么解决Java8(291)之后禁用了TLS1.1使JDBC无法用SSL连接SqlServer2008怎么解决May 16, 2023 pm 11:55 PM

Java8-291之后,禁用了TLS1.1,使JDBC无法用SSL连接SqlServer2008怎么办,以下是解决办法修改java.security文件1.找到jre的java.security文件如果是jre,在{JAVA_HOME}/jre/lib/security中,比如????C:\ProgramFiles\Java\jre1.8.0_301\lib\security如果是Eclipse绿色免安装便携版在安装文件夹搜索java.security,比如????xxx\plugins\org

Java使用JDBC API连接MySQL数据库遇到的常见问题Java使用JDBC API连接MySQL数据库遇到的常见问题Jun 10, 2023 am 09:55 AM

近年来,Java语言的应用越来越广泛,而JDBCAPI是Java应用程序中与数据库交互的一种创造性方法,JDBC基于一种名为ODBC的开放数据库连接标准,使得Java应用程序能够连入任何数据库管理系统(DBMS)。其中,MySQL更是一款备受青睐的数据库管理系统。然而,连接MySQL数据库时,开发人员也会遇到一些常见问题,本文旨在介绍JDBCAPI连接M

Java错误:JDBC错误,如何解决和避免Java错误:JDBC错误,如何解决和避免Jun 24, 2023 pm 02:40 PM

随着Java的广泛应用,Java程序在连接数据库时经常会出现JDBC错误。JDBC(JavaDatabaseConnectivity)是Java中用于连接数据库的编程接口,因此,JDBC错误是在Java程序与数据库交互时遇到的一种错误。下面将介绍一些最常见的JDBC错误及如何解决和避免它们。ClassNotFoundException这是最常见的JDBC

Java如何实现JDBC批量插入Java如何实现JDBC批量插入May 18, 2023 am 10:02 AM

一、说明在JDBC中,executeBatch这个方法可以将多条dml语句批量执行,效率比单条执行executeUpdate高很多,这是什么原理呢?在mysql和oracle中又是如何实现批量执行的呢?本文将给大家介绍这背后的原理。二、实验介绍本实验将通过以下三步进行a.记录jdbc在mysql中批量执行和单条执行的耗时b.记录jdbc在oracle中批量执行和单条执行的耗时c.记录oracleplsql批量执行和单条执行的耗时相关java和数据库版本如下:Java17,Mysql8,Oracl

mysql中insert ignore、insert和replace的区别是什么mysql中insert ignore、insert和replace的区别是什么May 29, 2023 pm 04:40 PM

insertignore、insert和replace的区别指令已存在不存在举例insert报错插入insertintonames(name,age)values(“小明”,23);insertignore忽略插入insertignoreintonames(name,age)values(“小明”,24);replace替换插入replaceintonames(name,age)values(“小明”,25);表要求:有PrimaryKey,或者unique索引结果:表id都会自增测试代码创建表

MySQL中的JDBC编程该如何分析MySQL中的JDBC编程该如何分析May 30, 2023 pm 10:19 PM

一、数据库编程的必备条件编程语言,如Java,C、C++、Python等数据库,如Oracle,MySQL,SQLServer等数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需要基于Java操作MySQL即需要该驱动包。同样的,要基于Java操作Oracle数据库则需要Oracle的数据库驱动包ojdbc。二、Java的数据库编程:JDBCJDBC,即JavaDatabaseConnectiv

使用java的StringBuilder.insert()函数在指定位置插入字符串使用java的StringBuilder.insert()函数在指定位置插入字符串Jul 24, 2023 pm 09:37 PM

使用java的StringBuilder.insert()函数在指定位置插入字符串StringBuilder是Java中用于处理可变字符串的类,它提供了多种方法来操作字符串,其中insert()函数是用于在指定位置插入字符串的常用方法之一。在本文中,我们将介绍如何使用insert()函数来实现在指定位置插入字符串的功能,并给出相应的代码示例。insert()

如何在jQuery中添加、编辑和删除表格行?如何在jQuery中添加、编辑和删除表格行?Sep 05, 2023 pm 09:49 PM

在当今的Web开发时代,有效且高效的表管理变得非常重要,特别是在处理数据量大的Web应用程序时。从表中动态添加、编辑和删除行的能力可以显着增强用户体验并使应用程序更具交互性。实现这一目标的一种有效方法是利用jQuery的强大功能。jQuery提供了许多功能来帮助开发人员执行操作。表格行表格行是相互关联的数据的集合,由HTML中的元素表示。它用于将表格中的单元格(由元素表示)分组在一起。每个元素用于定义表中的一行,对于多属性表,通常包含一个或多个元素。语法$(selector).append(co

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具