Statement对象的executeQuery()方法一般用于执行一个select语句,它只返回一个结果集,要想把查询结果最后显示给用户,必须对ResultSet对象进行处理。ResultSet对象包括一个由查询语句返回的一个表,这个表中包含所有的查询结果。对ResultSet对象的处理必须逐行进行。ResultSet对象维持一个指向当前行的指针(类似于Iterator的用法)。最初,这个指针指向第一行之前。ResultSet的next()方法使这个指针移向下一行。因此,第一次使用next()方法将指针指向结果集的第一行,这是可以对第一行的数据进行处理。处理完毕后,使用next()方法,将指针移向下一行,继续处理第二行数据。next()方法的返回值是一个boolean值,若为true,则说明指针成功地移向下一行,可以对该行进行处理。若返回值是false,则说明没有下一行,即结果集已经处理完毕。按从左至右的顺序对各列进行处理可以获得较高的执行效率。ResultSet接口的getXXX()方法可以从某列中获得结果,XXX表示JDBC的数据类型。
请看下例:
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
public class ResultSetTest {
public static void main(String[] args) {
Connection con = null;
try {
con = DBCon
.getConnectionFromPooledDataSource("jdbcPool/mydatasource");
Statement st = con.createStatement();
String query = "select id,name from student";
// 获得一个结果集
ResultSet rs = st.executeQuery(query);
// 获得结果集的元数据(表及相关的信息)
ResultSetMetaData rsmt = rs.getMetaData();
// 得到结果集有几列
int num = rsmt.getColumnCount();
String[] columns = new String[num];
// 列的序号是从1开始的
for (int i = 0; i < num; i++)
columns[i] = rsmt.getColumnName(i + 1);
// 先输出列名
for (int i = 0; i < num; i++)
System.out.print(columns[i] + " ");
// 输出列名之后换行
System.out.println();
// 取出结果
while (rs.next()) {
// 输出每一行的值
for (int i = 1; i <= num; i++) {
String temp = rs.getString(i);
System.out.print(temp + " ");
}
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 用完后要关闭连接,释放资源
if (con != null)
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
输出结果为:(Eclipse环境)