对于JDBC 3.0, 使用statement.getGeneratedKeys()可以返回刚刚插入的记录的自动增长的ID值。对于ORACLE,一般是定义一个序列,然后利用序列的nextval来自动给列分配ID值。但是很多人发现,在利用ORACLE JDBC驱动编写的时候,往往会失败。显示“java.sql.SQLException: Unsupported feature”。
其实,对于ORACLE JDBC,只有在10.2.0.1.0版本后的JDBC才支持getGeneratedKeys特性。而且如果使用下列代码:
String sql = "INSERT INTO FOO (NAME) VALUES ('BAR')";
Statement stmt = connection.createStatement();
stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
oracle.sql.ROWID rid = (oracle.sql.ROWID) rs.getObject(1); //getLong and getInt fail
// The following fail
// long l = rid.longValue();
// int i = rid.intValue();
String s = rid.stringValue(); // s equals "AAAXcTAAEAAADXYAAB"
返回的将是ROWID值。可以使用下列代码:
String sql = "INSERT INTO ORDERS (ORDER_ID, CUSTOMER_ID) VALUES (ORDER_ID_SEQ.NEXTVAL, ?)";
String generatedColumns[] = {"ORDER_ID"};
PreparedStatement pstmt = conn.prepareStatement(sql, generatedColumns);
pstmt.setLong(1, customerId);
pstmt.executeUpdate();
ResultSet rs = pstmt.getGeneratedKeys();
rs.next();
// The generated order id
long orderId = rs.getLong(1);
能得到正确的ID值。注意,其中generatedColumns[]表示从哪个列来获取新的ID值。我们也可以使用:
int a[]={1};
PreparedStatement pstmt = conn.prepareStatement(sql, a);
......
来表示第1列是KEY列,我们要获取第1列的新插入的值。
分享到:
相关推荐
由于我们只插入了一条记录,所以`ResultSet`通常只有一个行,可以通过`rs.getInt(1)`获取第一列(也是唯一一列)的主键值。 注意,这个过程只适用于那些在插入时能立即返回自增主键的数据库系统,比如MySQL。在某些...
通过以上步骤,我们可以构建一个功能完备的JSP留言管理程序,利用JDBC和Oracle数据库实现数据的存取。在实际项目中,还可以考虑引入MVC框架(如Spring MVC)来提升代码的可维护性和可扩展性。同时,对用户体验、响应...
例如,如果我们有一个名为`employees`的表,包含`id`,`name`和`salary`字段,我们可以这样插入一条新记录: ```sql INSERT INTO employees (id, name, salary) VALUES (100, '张三', 5000); ``` 接下来,我们讨论...
START_DATE字段用于存储新插入的一条记录时的时间。DUE_DATE字段用于存储该步骤的最后期限,如果一个动作的结果致使了一个新的步骤,则该结果的due-date属性的值为新的当前步骤的DUE_DATE字段。 OSWorkflow基于JDBC...
准备一条SQL插入语句,用于插入新的记录。 ```java PreparedStatement ps = conn.prepareStatement("INSERT INTO BLOBTEST (ID, NAME, PICTURE) VALUES (1, 'fang.jpg', ?)"); ``` ##### 4.2 创建空的BLOB对象 在...
以上就是使用JDBC调用Oracle存储过程进行增删改查的基本步骤和概念。实际应用中,可能需要处理异常、优化性能,以及根据具体需求调整代码结构。在开发时,确保遵循最佳实践,如使用连接池、预编译的...
1.写一条恒成立的select语句,无论你输入的条件是什么,总是能讲表中的所有数据输出 select id,last_name from s_emp where '1' ='1'; where 1=1; findByOption(Integer age,String province,String gender){ ...
插入记录时,我们可以直接使用静态SQL语句插入一条记录,也可以使用预编译的PreparedStatement对象,该对象能提高SQL执行效率,并防止SQL注入攻击。在PreparedStatement对象中,我们通过调用setString()等方法为SQL...
一对多关联通常表示为一个表中的记录可以与另一个表中的多条记录相关联。例如,一个部门可以有多个员工。这样的关联可以通过外键实现。查询这类关系时,可以使用`JOIN`语句: ```sql SELECT d.department_name, e....
1. **数据库设计**:设计数据库表结构,如创建一个名为`news`的表,包含`id`(主键)、`title`(标题)、`content`(内容)、`publish_date`(发布日期)和`author`(作者)等字段。 2. **JDBC连接**:在JSP中,...
例如,创建一个表并插入一条记录,然后回滚事务,序列值会被递增,但在回滚后不会减回去。 ```sql CREATE SEQUENCE my_sequence START WITH 1 INCREMENT BY 1 MAXVALUE 99999 NOCACHE; CREATE TABLE test (id ...
如果删除了一些记录,然后重启 MySQL,再插入一条记录,新记录的 ID 会是多少?答案取决于表的类型。如果表的类型是 MyISAM,那么自增主键的最大 ID 会被记录到数据文件中,即使重启 MySQL 也不会丢失。反之,如果表...
**题目**: 当一张表里有ID自增主键,插入了17条记录之后,删除了第15,16,17条记录,重启MySQL后再插入一条记录,这条记录的ID是18还是15? **解答**: 在MySQL中,自增主键不会因为删除某些记录而回退到已删除的最大...
例如,插入一条新记录: ```java Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); User user = new User(); user.setUsername("testUser"); user.set...
之后,通过`insert`语句插入一条测试数据。 接下来,文档提到了一个名为`MMC_01`的Servlet类,这个类继承自`HttpServlet`。在Servlet中,`doGet`方法是处理HTTP GET请求的主要入口。在这个例子中,`doGet`方法包含...
- **问题**:一张表中有 ID 自增主键,当插入了 17 条记录之后,删除了第 15,16,17 条记录,重启 MySQL 后,再插入一条记录,这条记录的 ID 是 18 还是 15? - **答案**:ID 会是 18。即使删除了一些记录,自增 ID ...
MyISAM存储引擎会将自增主键的最大值记录在数据文件中,而InnoDB仅保存在内存里,这意味着在MySQL重启后InnoDB存储引擎的表自增主键的最大值会丢失,因此下一条插入的记录ID会从之前的最大值继续开始。 2. MySQL的...
在学生信息管理系统中,JDBC扮演着至关重要的角色,它负责在服务器端与Oracle数据库之间建立连接,执行SQL查询,插入、更新或删除学生数据。 系统的核心功能包括: 1. **数据连接**:通过加载Oracle数据库驱动并...
为了确保每条记录都有唯一的标识符,可以创建一个序列并在插入时自动填充主键字段。示例如下: ```sql CREATE OR REPLACE TRIGGER stu_trigger BEFORE INSERT ON student FOR EACH ROW WHEN (NEW.id IS NULL) ...