自JDBC2.0之后,可滚动(Scrollable)结果集出现,利用可滚动结果集你可以在结果集中前后移动,并可以跳到任意行,后者通过绝对行号和当前行号的偏移量都能够实现。可滚动结果集可以“感知”到用于填充它的数据库表中行的修改,这意味着它对于数据库中的某些修改是敏感的,这称为敏感的可滚动(sensitive scrollable)结果集。结果集也可以用于更新、删除、插入底层数据库表中的行,这称为可更新(updatable)结果集。
1、结果集的创建
假设我们已经获得一个对数据库的连接conn,以下语句创建了不敏感的可滚动结果集,同时它是可更新的。
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
//createStatement接受两个参数:结果集类型(type)和结果集的并发性(concurrency)。
结果集类型决定结果集是否是可滚动的,如果是可滚动的,还要决定它对数据库修改是否敏感,结果集类型是由定义在ResultSet中的如下int类型字段指定的:
- ResultSet.TYPE_FORWARD_ONLY:指定结果集不可滚动,这是默认值。
- ResultSet.TYPE_SCROLLABLE_INSENSITIVE:指定结果集可滚动,但对数据库修改不敏感。
- ResultSet.TYPE_SCROLLABLE_SENSITIVE:指定结果集可滚动,并对数据库修改敏感。
结果集并发性由ResultSet中如下int类型字段指定:
- ResultSet.CONCUR_READ_ONLY:指定结果集不能修改填充它的数据库表中的行,这是默认值。
- ResultSet.CONCUR_UPDATABLE:指定结果接可以修改填充它的数据库表中的行。
2、在可滚动结果集中移动
创建可滚动结果集之后,可以通过以下方法来进行移动:
- next():移动到结果集中的下一行。
- previous():移动到前一行。
- first():移动到第一行。
- last():移动到最后一行。
- beforeFirst():移动到第一行之前,常用于从头开始读取行。
- afterLast():移动到最后一行之后。
- absolute(int rowNumber):移动到行数为rowNumber的行;如果rowNumber为负值,则以最后一行为首、第一行为尾,由首向尾移动行数为rowNumber的绝对值的行。
- relative(int relativeRowNumber):相对结果集当前所在行,移动行数为relativeRowNumber的行,若relativeRowNumber为负值,则相对当前行向前移动
注意:以上用于在结果集中移动的函数,如果没找到要移动到的行,则返回false,否则返回true。
获得当前位置:
getRow()、isFirst()、isLast()、isBeforeFirst()、isAfterLast()
3、在可更新结果集操作行
对于可更新结果集使用的查询有许多限制:
- 只能使用一个表。
- 必须选择这个表的主键和所有其他NOT NULL列。
- 不能使用ORDER BY字句。
- 必须只选择列值。
- 不能使用SELECT *,你必须使用表别名,如SELECT customer.* FROM customer。
更新行:update()
update方法用来对不同数据类型的列做修改,如要对VARCHAR2类型列作修改,则用到updateString(String colName,String newVal),第一个参数指定列名,第二个参数指定一个新值。例如对Date类型列修改时:
java.sql.Date newDate = new java.sql.Date(69,1,1);
myResultSet.updateDate("birthday",newDate);
注意:不能使用update方法对主键进行修改。
最后,一旦完成对当前行的修改后,需要需要使用updateRow()方法将这些修改发送到数据库:myResultSet.updateRow();可以使用Connection对象的commit()方法提交它。
删除行:deleteRow()
移动到要删除的行之后,可以利用deleteRow()方法删除当前行:
myResultSet.absolute(2);
myResultSet.deleteRow();
更新和删除时发生的冲突:
利用SELECT语句对结果集进行填充时,这个语句返回的行并没被数据库“锁定”,这就意味着其他事务可能对你的结果集进行修改,这就形成了冲突。解决这个问题的方法就是:在SELECT语句添加字句FOR UPDATE,用以锁定返回到结果集中的行。
插入行:insertRow()
插入行的一般顺序是:
1)利用moveToInsertRow()方法创建一个新的空行。
2)利用update()方法对这一空行的各列进行修改,这里要注意的是必须利用update()方法设置主键和NOT NULL列的值。
3)利用insertRow()将插入行操作发送到数据库。
4)利用moveToCurrentRow()返回到插入行之前的那个行。
最后附上创建结果集、操作结果集的实例代码:
public static void main(String[] args)throws SQLException{
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","username","pwd");
conn.setAutoCommit(false);
//创建敏感的可更新结果集
Statement myStatement = conn.createStatement(
ResultSet.TYPE_SCROLLABLE_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
//创建ResultSet对象,并用SELECT语句填充它。
//Note:这里利用FOR UPDATE让数据库锁定了结果集中的行
ResultSet myResultSet = myStatement.excuteQuery("SELECT id,name "+
"FROM customer FOR UPDATE");
//更新行
myResultSet.absolute(2);//直接移动到第二行
String newName = "hahaha";
myResultSet.updateString("name",newName);
myResultSet.updateRow();
//插入行
myResultSet.moveToInsertRow();
myResultSet.updateInt("id",5);//设置主键值
myResultSet.updateString("name","wowowo");//设置NOT NULL列name
myResultSet.insertRow();//将插入操作发送到数据库
myResultSet.moveToCurrentRow();//返回插入之前的那个行,这里应该是第二行
//删除行
myResultSet.relative(3);//相对当前行(第二行)向前移动三行(至第五行)
myResultSet.deleteRow();
//查询结果集中的数据
myResultSet.beforeFirst();
while(myResultSet.next()){
System.out.pritnln("id = "+myResultSet.getInt("id"));
System.out.println("name = "+myResultSet.getString("name"));
}
//关闭结果集
myResultSet.close();
//关闭JDBC对象
myStatement.close();
conn.close();
}//end of main
分享到:
相关推荐
JDBC(Java Database Connectivity)是Java编程语言中用于与关系型数据库进行交互的一套标准API。它是Java平台的标准,使得开发者能够用Java语言编写数据库应用程序,而无需关注底层数据库的具体实现。下面将详细...
在JDBC高级应用中,我们可以利用其提供的功能实现更高效、更灵活的数据操作。以下是一些关键知识点: 1. **元数据获取**: - `DatabaseMetaData` 类提供了关于数据库的各种元数据信息,例如获取所有表名、列信息、...
本篇教材旨在深入探讨JDBC API在数据库编程中的应用,特别是针对高级数据库操作。 ### 1. JDBC API基础 JDBC API主要包含以下组件: - **DriverManager**: 连接数据库的管理器,负责注册驱动、获取连接等。 - **...
3. **处理返回结果**:JDBC还提供了处理数据库返回结果集的功能,包括读取、更新等操作。 #### 四、JDBC的4种驱动程序 JDBC驱动程序是实现JDBC与具体数据库交互的关键组件,根据其工作原理可以分为以下四种类型: ...
此外,JDBC编程也有一些高级特性,比如连接池、事务处理、批处理等,这些都可以在JDBC编程中使用,以提高程序的性能和效率。 在实际开发中,由于JDBC编程较为繁琐,通常会使用一些框架来简化JDBC编程,比如...
#### 第三章:JDBC高级应用 **3.1 批量更新** - **使用PreparedStatement:** 可以通过添加多个执行语句,然后一次提交,提高执行效率。 **3.2 事务管理** - **Connection接口:** 提供了`setAutoCommit(false)`...
JDBC允许Java开发者执行SQL语句,处理结果集,甚至进行事务管理。本资料"JDBC编程技术.rar"提供了关于JDBC编程的详细指南和实例,作者brownmxh是一名Java领域的专家。 在JDBC编程中,首先需要理解的是JDBC驱动程序...
实验要求你掌握JDBC的基本操作,包括连接、执行SQL语句和处理结果集。 3. **数据库连接**:使用JDBC进行数据库连接时,首先需要加载数据库驱动,这可以通过`Class.forName()`方法实现。然后,使用`DriverManager....
通过《Java数据库高级编程宝典》的配套光盘,读者不仅可以学习到JDBC的基础知识,还能深入实践,掌握数据库编程的各种高级技巧。无论是新手还是经验丰富的开发者,都能从中受益,提升自己的数据库编程能力。
- **JDBC API**:这一层包含了用于执行数据库操作的所有API,例如创建连接、执行查询、处理结果集等。 **1.4 JDBC体系结构图** ![JDBC体系结构](https://example.com/jdbc-architecture.png) - Java数据库应用...
5. **处理结果集**:对于查询语句,`executeQuery()`返回的结果集`ResultSet`可以通过迭代遍历,获取每一行的数据。`ResultSet`提供了如`getInt()`, `getString()`等方法来获取不同类型的列值。 6. **关闭资源**:...
5. 处理结果集:查询结果返回一个ResultSet对象,可以通过迭代遍历并提取数据。 6. 关闭资源:在完成数据库操作后,记得关闭Statement、ResultSet和Connection,以释放系统资源。 在实际开发中,我们还经常使用...
在Java编程中,连接各种数据库是常见的操作,Greenplum数据库作为一款高效的企业级数据仓库解决方案,也提供了Java Database Connectivity (JDBC) 驱动,使得Java开发者能够方便地通过Java程序与Greenplum数据库进行...
综上所述,使用JDBC进行高级数据库操作涉及连接管理、预编译SQL、批处理、事务控制、结果集处理、存储过程、连接池、JDBC批注等多个方面。理解和掌握这些技术,可以提升你的Java数据库编程能力,实现高效、安全的...
《JDBC与Java数据库编程》一书旨在深入探讨Java如何通过JDBC(Java Database Connectivity)这一接口与数据库进行高效互动,实现数据的读取、写入、更新等操作。以下是对该主题的详细解析,包括JDBC的概念、体系结构...
此外,微软的JDBC驱动还包含了对MARS(Multiple Active Result Sets)的支持,允许在一个连接中同时处理多个结果集,提高了应用程序的效率。 总之,`sqljdbc4-3.0.zip`是连接MS SQL Server的重要组件,通过这个驱动...
JDBC由一组接口和类组成,这些接口和类定义了如何连接到数据库、发送SQL语句并处理结果集的方法。 #### 二、JDBC的安装与配置 ##### 1. 获取JDBC驱动程序 - **Oracle JDBC Driver**: 需要从Oracle官方网站下载适用...
JDBC还支持事务处理、批处理、结果集处理等多种高级功能,使得Java开发者能够构建高效、可靠的数据库应用程序。在实际开发中,通常会使用ORM框架如Hibernate或MyBatis,它们在JDBC的基础上提供更高级别的抽象,简化...
- **JDBC**:使用 JDBC 进行数据库操作需要编写大量的 SQL 语句,并手动管理连接、事务和结果集。开发者需要将数据转换为 Java 对象和反之亦然。 - **Hibernate**:ORM 框架如 Hibernate 提供了一种面向对象的编程...