`
idealab
  • 浏览: 195505 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

JDBC高级编程:操作结果集

    博客分类:
  • Java
阅读更多
       自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

7
2
分享到:
评论

相关推荐

    JDBC笔记 JDBC笔记

    同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了...

    JDBC 3.0数据库开发与设计

    第4章 JDBC 3.0 API数据库开发高级操作 4.1 预编译语句 4.1.1 PreparedStatement对象的创建 4.1.2 传递IN参数 4.1.3 传递对象参数 4.1.4 传递大型数据参数 4.2 调用存储过程对象 4.2.1 CallableStatement...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    该资料是《Oracle SQL高级编程》的源代码 对应的书籍资料见: Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: Apress 作者: (美)Karen Morton Kerry ...

    Java高级程序设计实战教程第八章-Java数据库编程.pptx

    (1)加载连接数据库的驱动程序 (2)建立连接 (3)查询数据库 (4)处理结果集 (5)关闭查询语句及数据库连接 Java高级程序设计实战教程第八章-Java数据库编程全文共12页,当前为第6页。 8.3 任务实施 任务一 编写程序实现...

    计算机程序设计(Java)-教案--单元十--数据库编程技术.docx.docx

    /调用Statement对象的executeQuery()方法执行SQL查询语句,并获得一个ResultSet类型的查询结果集对象,调用executeUpdate()方法执行SQL更新语句更新数据库中的数据;/根据应用程序的具体要求调用ResultSet对象的相关...

    Java开发详解.zip

    031704_【第17章:Java数据库编程】_JDBC操作步骤及数据库连接操作笔记.pdf 031705_【第17章:Java数据库编程】_执行数据库更新操作笔记.pdf 031706_【第17章:Java数据库编程】_ResultSet接口笔记.pdf 031707_【第...

    JSP高级编程

    11.1.2 结果集增强功能 11.1.3 批处理更新 11.1.4 对Java对象的持久性 11.1.5 数据库连接池使用实例 11.2 文件上载 11.2.1 实现机理 11.2.2 文件上载实例 第12章 JSP高级应用实例:网上书店 12.1 ...

    老罗android开发视频教程全集百度网盘下载

    【第一版第六章】老罗Android开发视频--服务器端JDBC编程(2集) 【第一版第七章】老罗Android开发视频--服务器端Web编程(6集) 【第一版第八章】老罗Android开发视频-常用UI控件(33集) 【第一版第九章】老罗...

    Java数据库编程宝典 PDF格式

    《Java数据库编程宝典》是一本集综合性、实用性为一体的全面讲解使用Java语言进行高级数据库开发的书籍。本书从数据库的基础知识、软件开发环境的构建以及JSP,Veloctiy,OJB,Struts等常用技术的基础知识入手,通过...

    Lotus.Domino.Web编程

    4.2.2 使用帧结构集设计元素 84 4.2.3 使用标签 88 4.3 使用大纲 94 4.3.1 同时使用帧和大纲 95 4.3.2 显示大纲小程序 97 4.4 使用其他的设计元素 97 参考信息 101 本章小结 101 第5章 编写JavaScript 103 5.1 简介 ...

    mybatis面试题(经典问答)

    Mybatis 省去了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 Mybatis 可以通过简单的 XML 或注解将原始类型、接口和 Java POJO(plain old Java objects)配置和映射为数据库中的记录。 3.什么是ORM? ...

    Spring高级之注解驱动开发视频教程

    合集中的每一项都是针对不同数据存储做的简化封装,使我们在操作不同数据库时,以最简洁的代码完成需求功能。 SpringTest它是针对Junit单元测试的整合。让我们在开发中以及开发后期进行测试时,直接使用Junit结合...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    《Java Web编程宝典(十年典藏版)》是一本集技能、范例、项目和应用为一体的学习手册,书中介绍了应用Java Web进行程序开发的各种技术、技巧。全书分4篇,共24章,其中,第1篇为技能学习篇,主要包括Java Web开发环境...

    JSP动态网页新技术

    第9、10章分别给出编程实例:JSP的BBS论坛程序、JSP聊天室程序,第11章是JSP的编程技巧集;附录部分提供了6个上机指导操作。 本书结构清晰,内容丰富,讲解深入,实际范例与软件功能紧密结合。不但是从事用JSP进行...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 ...12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 ...12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...

    weixin135房屋租赁管理系统的设计与实现+ssm--论文pf.rar

    MyBatis:一个优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射,并且避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。 数据库:通常使用MySQL或其他关系型数据库来存储数据,如用户信息、房产...

Global site tag (gtag.js) - Google Analytics