|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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里有这些工具吗?要简单多少?。 |
|