仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 572|回复: 15
打印 上一主题 下一主题

[学习教程] JAVA教程之JDBCTM 指南:进门5 - ResultSet

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:18:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Java到底会发战成什么样,让我们拭目以待吧,我始终坚信着java会更好。以上都是俺个人看法,欢迎大家一起交流.5-ResultSet
本概述是从《JDBCTMDatabaseAccessfromJavaTM:ATutorialandAnnotatedReference》这本书中摘引来的。JavaSoft今朝正在筹办这本书。这是一本教程,同时也是JDBC的主要参考手册,它将作为Java系列的构成部分在1997年春季由Addison-Wesley出书公司出书。


5.1概述
ResultSet包括切合SQL语句中前提的一切行,而且它经由过程一套get办法(这些get办法能够会见以后行中的分歧列)供应了对这些行中数据的会见。ResultSet.next办法用于挪动到ResultSet中的下一行,使下一行成为以后行。

了局集通常为一个表,个中有查询所前往的列题目及响应的值。比方,假如查询为SELECTa,b,cFROMTable1,则了局集将具有以下情势:


abc
-------------------------
12345CupertinoCA
83472RedmondWA
83492BostonMA


上面的代码段是实行SQL语句的示例。该SQL语句将前往行汇合,个中列1为int,列2为String,而列3则为字节数组:


java.sql.Statementstmt=conn.createStatement();
ResultSetr=stmt.executeQuery("SELECTa,b,cFROMTable1");
while(r.next())
{
//打印以后行的值。
inti=r.getInt("a");
Strings=r.getString("b");
floatf=r.getFloat("c");
System.out.println("ROW="+i+""+s+""+f);
}

5.1.1行和光标
ResultSet保护指向其以后数据行的光标。每挪用一次next办法,光标向下挪动一行。最后它位于第一行之前,因而第一次挪用next将把光标置于第一行上,使它成为以后行。跟着每次挪用next招致光标向下挪动一行,依照从上至下的序次猎取ResultSet行。

在ResultSet对象或其父辈Statement对象封闭之前,光标一向坚持无效。

在SQL中,了局表的光标是着名字的。假如数据库同意定位更新或定位删除,则必要将光标的名字作为参数供应给更新或删除命令。可经由过程挪用办法getCursorName取得光标名。

注重:不是一切的DBMS都撑持定位更新和删除。可以使用DatabaseMetaData.supportsPositionedDelete和supportsPositionedUpdate办法来反省特定毗连是不是撑持这些操纵。当撑持这些操纵时,DBMS/驱动程序必需确保得当锁定选定行,以使定位更新不会招致更新非常或别的并提问题。


5.1.2列
办法getXXX供应了猎取以后行中某列值的路子。在每行内,可按任何序次猎取列值。但为了包管可移植性,应当从左至右猎取列值,而且一次性地读取列值。

列名或列号可用于标识要从中猎取数据的列。比方,假如ResultSet对象rs的第二列名为“title”,并将值存储为字符串,则以下任一代码将猎取存储在该列中的值:

Strings=rs.getString("title");
Strings=rs.getString(2);

注重列是从左至右编号的,而且从列1入手下手。同时,用作getXXX办法的输出的列名不辨别巨细写。

供应利用列名这个选项的目标是为了让在查询中指定列名的用户可以使用不异的名字作为getXXX办法的参数。另外一方面,假如select语句未指定列名(比方在“select*fromtable1”中或列是导出的时),则应当利用列号。这些情形下,用户将没法切实晓得列名。

有些情形下,SQL查询前往的了局会合大概有多个列具有不异的名字。假如列名用作getXXX办法的参数,则getXXX将前往第一个婚配列名的值。因此,假如多个列具有不异的名字,则必要利用列索引来确保检索了准确的列值。这时候,利用列号效力要略微高一些。

关于ResultSet中列的信息,可经由过程挪用办法ResultSet.getMetaData失掉。前往的ResultSetMetaData对象将给出其ResultSet对象各列的编号、范例和属性。

假如列名已知,但不知其索引,则可用办法findColumn失掉其列号。


5.1.3数据范例和转换
关于getXXX办法,JDBC驱动程序试图将基础数据转换成指定Java范例,然后前往合适的Java值。比方,假如getXXX办法为getString,而基础数据库中数据范例为VARCHAR,则JDBC驱动程序将把VARCHAR转换成JavaString。getString的前往值将为JavaString对象。

下表显现了同意用getXXX猎取的JDBC范例及保举用它猎取的JDBC范例(通用SQL范例)。小写的x暗示同意getXXX办法猎取该数据范例;年夜写的X暗示对该数据范例保举利用getXXX办法。比方,除getBytes和getBinaryStream以外的任何getXXX办法都可用来猎取LONGVARCHAR值,可是保举依据前往的数据范例利用getAsciiStream或getUnicodeStream办法。办法getObject将任何数据范例前往为JavaObject。当基础数据范例是特定于数据库的笼统范例或当通用使用程序必要承受任何数据范例时,它长短常有效的。

可以使用ResultSet.getXXX办法猎取罕见的JDBC数据范例。

“x”暗示该getXXX办法可正当地用于猎取给定JDBC范例。

“X”暗示保举利用该getXXX办法来猎取给定JDBC范例。

 T
I
N
Y
I
N
TS
M
A
L
L
I
N
TI
N
T
E
G
E
RB
I
G

N
TR
E
A
LF
L
O
A
TD
O
U
B
L
ED
E
C
I
M
A
LN
U
M
E
R
I
CB
I
TC
H
A
RV
A
R
C
H
A
R
L
O
N
G
V
A
R
C
H
A
RB
I
N
A
R
YV
A
R
B
I
N
A
R
YL
O
N
G
V
A
R
B
I
N
A
R
YD
A
T
ET
I
M
ET
I
M
E
S
T
A
M
P
getByteXxxxxxxxxxxxx      
getShortxXxxxxxxxxxxx      
getIntxxXxxxxxxxxxx      
getLongxxxXxxxxxxxxx      
getFloatxxxxXxxxxxxxx      
getDoublexxxxxXXxxxxxx      
getBigDecimalxxxxxxxXXxxxx      
getBooleanxxxxxxxxxXxxx      
getStringxxxxxxxxxxXXxxxxxxx
getBytes             XXx   
getDate          xxx   X x
getTime          xxx    Xx
getTimestamp          xxx   x X
getAsciiStream          xxXxxx   
getUnicodeStream          xxXxxx   
getBinaryStream             xxX   
getObjectxxxxxxxxxxxxxxxxxxx



5.1.4对十分年夜的行值利用流
ResultSet能够猎取恣意年夜的LONGVARBINARY或LONGVARCHAR数据。办法getBytes和getString将数据前往为年夜的块(最年夜为Statement.getMaxFieldSize的前往值)。可是,以较小的流动块猎取十分年夜的数据大概会更便利,而这可经由过程让ResultSet类前往java.io.Input流来完成。从该流中可分块读取数据。注重:必需当即会见这些流,由于鄙人一次对ResultSet挪用getXXX时它们将主动封闭(这是因为基础完成对年夜块数据会见无限制)。

JDBCAPI具有三个猎取流的办法,分离具有分歧的前往值:


getBinaryStream前往只供应数据库原字节而不举行任何转换的流。


getAsciiStream前往供应单字节ASCII字符的流。


getUnicodeStream前往供应双字节Unicode字符的流。


注重:它分歧于Java流,后者前往无范例字节并可(比方)通用于ASCII和Unicode字符。

以下代码演示了getAsciiStream的用法:

java.sql.Statementstmt=con.createStatement();
ResultSetr=stmt.executeQuery("SELECTxFROMTable2");
//如今以4K块巨细猎取列1了局:
bytebuff=newbyte[4096];
while(r.next()){
Java.io.InputStreamfin=r.getAsciiStream(1);
for(;;){
intsize=fin.read(buff);
if(size==-1){//抵达流开端
break;
}
//将新添补的缓冲区发送到ASCII输入流:
output.write(buff,0,size);
}
}

5.1.5NULL了局值
要断定给定了局值是不是是JDBCNULL,必需先读取该列,然后利用ResultSet.wasNull办法反省该次读取是不是前往JDBCNULL。

当利用ResultSet.getXXX办法读取JDBCNULL时,办法wasNull将前往以下值之一:


Javanull值:关于前往Java对象的getXXX办法(比方getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject等)。


零值:关于getByte、getShort、getInt、getLong、getFloat和getDouble。


false值:关于getBoolean。


5.1.6可选了局集或多了局集
一般利用executeQuery(它前往单个ResultSet)或executeUpdate(它可用于任何数据库修正语句,并前往更新行数)可实行SQL语句。但有些情形下,使用程序在实行语句之前不晓得该语句是不是前往了局集。别的,有些已存储历程大概前往几个分歧的了局集和/或更新计数。

为了顺应这些情形,JDBC供应了一种机制,同意使用程序实行语句,然后处置由了局集和更新计数构成的恣意汇合。这类机制的道理是起首挪用一个完整通用的execute办法,然后挪用别的三个办法,getResultSet、getUpdateCount和getMoreResults。这些办法同意使用程序一次一个地研讨语句了局,并断定给定了局是ResultSet仍是更新计数。

用户不用封闭ResultSet;当发生它的Statement封闭、从头实行或用于从多了局序列中猎取下一个了局时,该ResultSet将被Statement主动封闭。


诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net里有这些工具吗?要简单多少?。
分手快乐 该用户已被删除
沙发
发表于 2015-1-20 19:52:14 来自手机 | 只看该作者
是一种使用者不需花费很多时间学习的语言
小妖女 该用户已被删除
板凳
发表于 2015-1-22 06:56:06 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
愤怒的大鸟 该用户已被删除
地板
发表于 2015-1-24 15:46:57 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-2 06:07:18 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
灵魂腐蚀 该用户已被删除
6#
发表于 2015-2-6 17:23:21 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
爱飞 该用户已被删除
7#
发表于 2015-2-7 01:59:52 | 只看该作者
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
透明 该用户已被删除
8#
发表于 2015-2-8 06:55:07 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
深爱那片海 该用户已被删除
9#
发表于 2015-2-10 23:42:48 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
海妖 该用户已被删除
10#
发表于 2015-3-1 17:37:06 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
柔情似水 该用户已被删除
11#
发表于 2015-3-7 08:55:20 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
精灵巫婆 该用户已被删除
12#
发表于 2015-3-7 12:28:23 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
只想知道 该用户已被删除
13#
发表于 2015-3-8 14:34:37 | 只看该作者
是一种使用者不需花费很多时间学习的语言
谁可相欹 该用户已被删除
14#
发表于 2015-3-11 06:47:27 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
admin 该用户已被删除
15#
发表于 2015-3-17 22:50:16 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
因胸联盟 该用户已被删除
16#
发表于 2015-3-25 04:18:49 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-11-15 15:56

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表