ResultSet的方法
如果数据库中某个字段为numberic类型,可以通过ResultSet中的哪个方法获取?
(1)getNumberic()
(2)getDouble()
(3)setNumberic()
(4)setDouble()
考点:考察求职者对于数据集(ResultSet)的熟悉和掌握。
出现频率:★★★★★
【面试题解析】ResultSet包含符合SQL语句中条件的所有行,并且它通过一套GET方法(这些GET方法可以访问当前行中的不同列)提供了对这些行中数据的访问。ResultSet.next方法用于移动到ResultSet中的下一行,使下一行成为当前行。ResultSet一般是一个表,其中有查询所返回的列标题及相应的值。如果查询为:
SELECT a, b, c FROM Table1
则ResultSet将具有如下形式:
a b c -------- --------- -------- 12345 Cupertino CA 83472 Redmond WA 83492 Boston MA
下面的代码段是执行SQL语句的示例。该SQL语句将返回行集合,其中a为int,b为String,而c则为字节数组。示例代码如下:
java.sql.Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (r.next()) { // 打印当前行的值。 int i = r.getInt("a"); String s = r.getString("b"); float f = r.getFloat("c"); System.out.println("ROW = " + i + " " + s + " " + f); }
1.行和光标
ResultSet维护指向其当前数据行的光标。每调用一次next()方法,光标向下移动一行。最初光标位于第1行之前,第1次调用next()方法将把光标置于第1行上,使它成为当前行。随着每次调用next()方法导致光标向下移动一行,按照从上至下的次序获取ResultSet行。
在ResultSet对象或其父辈Statement对象关闭之前,光标定位一直保持有效。
在SQL中,结果表的光标是有名字的。如果数据库允许定位更新或定位删除,则需要将光标的名字作为参数提供给更新或删除命令。可通过调用getCursorName()方法获得光标名。
注意:不是所有的DBMS都支持定位更新和删除。可使用DatabaseMetaData.supports PositionedDelete和supportsPositionedUpdate方法来检查特定连接是否支持这些操作。当支持这些操作时,DBMS或驱动程序必须确保适当锁定选定行,以使定位更新不会导致更新异常或其他并发问题。
2.列
GET方法提供了获取当前行中某列值的途径。在每一行内,可按任何次序获取列值。但为了保证可移植性,应该从左至右获取列值,并且一次性地读取列值。列名或列号可用于标识要从中获取数据的列。例如,如果ResultSet对象rs的第二列名为“title”,并将值存储为字符串,则以下两行中的任一代码段将获取存储在该列中的值。
String s = rs.getString("title"); String s = rs.getString(2);
注意:列是从左至右编号的,并且从列1开始。同时,用作GET方法的输入的列名参数不区分大小写。
有些情况下,SQL查询返回的ResultSet中可能有多个列具有相同的名字。如果将列名用作GET方法的参数,则GET方法将返回第1个匹配列名的值。因而,如果多个列具有相同的名字,则需要使用列索引来确保检索了正确的列值。
关于ResultSet中列的信息,可通过调用方法ResultSet.getMetaData()得到。返回的ResultSetMetaData对象将给出其ResultSet对象各列的编号、类型和属性。
如果列名已知,但不知其索引,则可用方法findColumn()方法得到其列号。
3.数据类型和转换
对于GET方法,JDBC驱动程序试图将基本数据转换成指定Java类型,然后返回适合的Java值。例如,如果GET方法为getString(),而基本数据库中数据类型为VARCHAR,则JDBC驱动程序将把VARCHAR转换成String类型。getString()的返回值为String对象。常见的方法请参考相关文档,这里不再列出。
4.NULL结果值
要确定给定结果值是否是NULL,必须先读取该列,然后使用ResultSet.wasNull()方法检查该次读取是否返回NULL。当使用ResultSet的GET方法读取NULL值时,wasNull()方法将返回下列值之一。
• NULL值,对应getString()、getBigDecimal()、getBytes()、getDate()、getTime()、getTimestamp()、getAsciiStream()、getUnicodeStream()、getBinaryStream()、getObject()等方法。
• 零值,对应getByte()、getShort()、getInt()、getLong()、getFloat和getDouble()方法。• false值,对应getBoolean()方法。
5.可选ResultSet或多ResultSet
通常使用executeQuery(它返回单个ResultSet)或executeUpdate(它可用于任何数据库修改语句,并返回更新行数)可以执行SQL语句。但有些情况下,应用程序在执行语句之前,不知道该语句是否返回ResultSet。此外,有些已存储过程可能返回几个不同的ResultSet和/或更新计数。
为了适应这些情况,JDBC提供了一种机制,允许应用程序执行语句,然后处理由ResultSet和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的execute方法,然后调用另外一个方法,getResultSet()、getUpdateCount()和getMoreResults()。这些方法允许应用程序一次一个地研究语句结果,并确定给定结果是ResultSet还是更新计数。
用户不必关闭ResultSet,当产生它的Statement关闭、重新执行,或用于从多结果序列中获取下一个结果时,该ResultSet将被Statement自动关闭。
面试题4中,数据库中的numberic类型为数字类型,应该使用ResultSet的getDouble()方法来获得浮点值。ResultSet并没有getNumberic()方法。
参考答案:(b)。