JDBC基础(三)

从结果集中检索值

现在展示在Java编写的程序中如何发送上面的SELECT语句,以及如何取得显示的结果。

 

JDBC将结果集返回给ResultSet对象,因此需要声明一个ResultSet类实例保存结果。下面代码展示了如何声明ResultSet对象rs并将前面的查询结果赋给它:

ResultSet rs = stmt.executeQuery(
    "SELECT COF_NAME, PRICE FROM COFFEES");

使用next方法

变量rs(ResultSet的一个实例)包含了前面例子的结果集中显示的咖啡单价表。为访问名称和单价要移动到每一行,根据它们的类型检索数值。next方法将光标移到下一行,使那行(称为当前行)成为可在其上操作的行。由于光标初始定位于ResultSet对象第一行的上面,所以第一次调用next方法将光标移到第一行,使它成为当前行。接下来调用next方法将使光标从上至下每次移动一行。对于JDBC 2.0 API(下一节讨论),除了向前移动光标外,还可反向移动光标、移动光标至特定位置及移动光标至当前行相对位置。

使用getXXX方法

适当类型的getXXX方法可用于检索列中的数值。例如,rs每行的第一列是COF_NAME,它存储着VARCHAR SQL类型的数值。检索VARCHAR SQL类型数值的方法是getString。每行第二列存储着FLOAT SQL类型的数值,检索该类型数值的方法是getFloat。下面代码访问rs中的当前行,然后输出由名称、3个空格和价格组成的一行字符串。每次调用next方法,下一行就成为当前行,循环一直持续到rs中再也没有可向前移动的行为止。

String query = "SELECT COF_NAME, PRICE FROM COFFEES";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
    String s = rs.getString("COF_NAME");
    float n = rs.getFloat("PRICE");
    System.out.println(s + "   " + n);
}

执行后将输出:

Colombian   7.99
French_Roast   8.99
Espresso   9.99
Colombian_Decaf   8.99
French_Roast_Decaf   9.99

注意,使用弯箭头表示从JDBC代码输出;这不是输出的组成。箭头不用于结果集中的结果,因此箭头可将结果集的内容和应用程序的输出区分开。

通过测试这段代码的两条getXXX语句,您将进一步看到getXXX方法的工作方式。先测试getString吧!

String s = rs.getString("COF_NAME");

由于对ResultSet对象rs调用了getString方法,因此getString将检出(取得)rs当前行COF_NAME列中的值。getString检出的值已从SQL CHAR类型转换成Java中的String并赋给了Sring对象s。注意,在上面的println表达式中使用了变量s,也就是println(s + " " + n) 。

getFloat方法与getString类似,只不过它检索PRICE列(这是SQL FLOAT类型)的值,并在赋给变量n之前转换成Java的Float。

JDBC使用两种方法标识getXXX方法检索数值的列。一种是指定列名,这也是前面例子所做的。另一种是指定列索引(列的序号),1表示第一列,2表示第二列,以此类推。使用列号代替列名,上面的语句将变为:

String s = rs.getString(1);
float n = rs.getFloat(2);

第一行代码提取rs当前行第一列的数值,然后将它转换为Java的String对象并赋给s。第二行代码提取rs当前行第二列的数值,然后将它转换为Java的Float对象并赋给n。注意,这里的列号指的是结果集中的列号,而不是原始表中的列号。

总之,JDBC允许使用列名或列号作为getXXX方法的参数。使用列号会更有效些,在某些场合还必须使用列号。但一般而言,使用列名和使用列号在本质上是等价的。

至于可用哪些getXXX方法检索不同的SQL数据类型,JDBC给了很大的灵活性。例如,getInt方法可用于检索任何numeric或character类型的数值。它检出的数据将转换成int;换言之,如果SQL类型是VARCHAR,JDBC将试着从VARCHAR中解析出一个整数。推荐只用getInt方法检索SQL INTEGER类型的数据;但它不能用于检索BINARY、VARBINARY、LONGVARBINARY、DATE、TIME或TIMESTAMP SQL类型的数据。

表24——检索SQL类型数据的方法展示了哪些方法可合法检索SQL类型的数据,特别是推荐用哪些方法检索各种SQL类型的数据。注意,这张表使用术语“JDBC类型”代替了“SQL类型”。这两个术语都指java.sql.Types中定义的一般SQL类型,它们之间可互换 。

使用getString方法

尽管推荐使用getString方法检索CHAR和VARCHAR SQL类型的数据,但也可能用它检索其他基本SQL类型的数据(但不可用它检索新的SQL3数据类型。本教程后面将讨论SQL3类型)。用getString检索所有数值有很多优点但也有局限。如果用它检索numeric类型的数据,getString将把numeric值转换成Java的String对象,这样一来,在数据要作为数字前就必须转换回numeric类型。在数值一直当成字符串的场合,这是无可非议的。如果想让程序检索除了SQL3类型之外的任何标准SQL类型,就可用getString方法。

使用ResultSet.getXXX方法检索JDBC类型


注意:如果阅读这张表有困难,请看 使用ResultSet.getXXX:Table-Free版,以取得相同信息的不同视图。

 

T
I
N
Y
I
N
T

S
M
A
L
L
I
N
T

I
N
T
E
G
E
R

B
I
G
I
N
T

R
E
A
L

F
L
O
A
T

D
O
U
B
L
E

D
E
C
I
M
A
L

N
U
M
E
R
I
C

B
I
T

C
H
A
R

 

V
A
R
C
H
A
R

L
O
N
G
V
A
R
C
H
A
R

B
I
N
A
R
Y

V
A
R
B
I
N
A
R
Y

L
O
N
G
V
A
R
B
I
N
A
R
Y

D
A
T
E

T
I
M
E

T
I
M
E
S
T
A
M
P

getByte

X

x

x

x

x

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getShort

x

X

x

x

x

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getInt

x

x

X

x

x

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getLong

x

x

x

X

x

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getFloat

x

x

x

x

X

x

x

x

x

x

x

x

x

 

 

 

 

 

 

getDouble

x

x

x

x

x

X

X

x

x

x

x

x

x

 

 

 

 

 

 

getBigDecimal

x

x

x

x

x

x

x

X

X

x

x

x

x

 

 

 

 

 

 

getBoolean

x

x

x

x

x

x

x

x

x

X

x

x

x

 

 

 

 

 

 

getString

x

x

x

x

x

x

x

x

x

x

X

X

x

x

x

x

x

x

x

getBytes

 

 

 

 

 

 

 

 

 

 

 

 

 

X

X

x

 

 

 

getDate

 

 

 

 

 

 

 

 

 

 

x

x

x

 

 

 

X

 

x

getTime

 

 

 

 

 

 

 

 

 

 

x

x

x

 

 

 

 

X

x

getTimestamp

 

 

 

 

 

 

 

 

 

 

x

x

x

 

 

 

x

x

X

getAsciiStream

 

 

 

 

 

 

 

 

 

 

x

x

X

x

x

x

 

 

 

getUnicodeStream

 

 

 

 

 

 

 

 

 

 

x

x

X

x

x

x

 

 

 

getBinaryStream

 

 

 

 

 

 

 

 

 

 

 

 

 

x

x

X

 

 

 

getObject

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

x

“x”指出可用getXXX方法合法检索指定的JDBC类型。

“X”指出推荐使用getXXX方法检索指定的JDBC类型。

 

你可能感兴趣的:(sql,C++,c,jdbc,C#)