ResultSet对象
在之前所讲解的ResultSet操作中,ResultSet主要用于存储结果集,并且只能通过next()方法由前向后逐个获取结果集中的数据。但是,如果想获取结果集中任意位置的数据,则需要在创建Statement对象时,设置两个ResultSet定义的常量,具体设置方式如下:
Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.excuteQuery(sql);
在上述方式中,常量“Result.TYPE_SCROLL_INSENITIVE”表示结果集可滚动,常量“ResultSet.CONCUR_READ_ONLY”表示以只读形式打开结果集。
为了大家更好地学习ResultSet对象的使用,接下来,通过一个案例来演示如何使用ResultSet对象滚动读取结果集中的数据,如例1所示。
例1 Example04.java
1 package cn.itcast.jdbc.example;
2 import java.sql.Connection;
3 import java.sql.DriverManager;
4 import java.sql.ResultSet;
5 import java.sql.SQLException;
6 import java.sql.Statement;
7 public class Example04 {
8 public static void main(String[] args) {
9 Connection conn = null;
10 Statement stmt = null;
11 try {
12 Class.forName("com.mysql.jdbc.Driver");
13 String url = "jdbc:mysql://localhost:3306/chapter01";
14 String username = "root";
15 String password = "itcast";
16 conn = DriverManager.getConnection(url, username, password);
17 String sql = "select * from users";
18 Statement st =conn.createStatement(
19 ResultSet.TYPE_SCROLL_INSENSITIVE,
20 ResultSet.CONCUR_READ_ONLY);
21 ResultSet rs = st.executeQuery(sql);
22 System.out.print("第2条数据的name值为:");
23 rs.absolute(2); //将指针定位到结果集中第2行数据
24 System.out.println(rs.getString("name"));
25 System.out.print("第1条数据的name值为:");
26 rs.beforeFirst(); //将指针定位到结果集中第1行数据之前
27 rs.next(); //将指针向后滚动
28 System.out.println(rs.getString("name"));
29 System.out.print("第4条数据的name值为:");
30 rs.afterLast(); //将指针定位到结果集中最后一条数据之后
31 rs.previous(); //将指针向前滚动
32 System.out.println(rs.getString("name"));
33 } catch (Exception e) {
34 e.printStackTrace();
35 } finally { // 释放资源
36 if (stmt != null) {
37 try {
38 stmt.close();
39 } catch (SQLException e) {
40 e.printStackTrace();
41 }
42 stmt = null;
43 }
44 if (conn != null) {
45 try {
46 conn.close();
47 } catch (SQLException e) {
48 e.printStackTrace();
49 }
50 conn = null;
51 }
52 }
53 }
54 }
程序的运行结果如图1所示。
图1 运行结果
从图1中可以看出,程序输出了结果集中指定的数据。由此可见,使用ResultSet对象处理结果集是相当灵活的。