管理结果集
可滚动、可更新(可修改)的结果集
使用absolute()、previous()、afterLast()等方法自由移动记录指针的ResultSet被称为可滚动的结果集。
在Java 5.0以后,默认打开的ResultSet()就是可滚动的。
以默认方式打开的ResultSet是不可更新的,必须要传入额外参数。Connection在创建Statement或PreparedStatement时,
传入如下两个参数:
resultSetType:可取三个值
- ResultSet.TYPE_FORWARD_ONLY:控制记录指针只能向前移动。
- ResultSet.TYPE_SCROLL_INSENSITINE:记录指针可以自由移动(可滚动结果集),但底层数据改变不会影响ResultSet 的内容。
- ResultSet.TYPE_SCROLL_SENSTTIVE:记录指针可以自由移动(可滚动结果集),底层数据改变会影响ResultSet 的内容。
resultSetConcurrency:控制ResultSet的并发类型,可接收两个值。
ResultSet.CONCUR_READ_ONLY:指示ResultSet是只读的并发模式(默认)
ResultSet.CONCUR_UPDATABLE:指示ResultSet是可更新的并发模式
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56import java.util.*;
import java.io.*;
import java.sql.*;
public class ResultSetTest
{
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws Exception
{
// 使用Properties类来加载属性文件
var props = new Properties();
props.load(new FileInputStream(paramFile));
driver = props.getProperty("driver");
url = props.getProperty("url");
user = props.getProperty("user");
pass = props.getProperty("pass");
}
public void query(String sql) throws Exception
{
// 加载驱动
Class.forName(driver);
try (
// 获取数据库连接
Connection conn = DriverManager.getConnection(url, user, pass);
// 使用Connection来创建一个PreparedStatement对象
// 传入控制结果集可滚动,可更新的参数。
PreparedStatement pstmt = conn.prepareStatement(sql,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet rs = pstmt.executeQuery())
{
rs.last();
int rowCount = rs.getRow();
for (var i = rowCount; i > 0; i--)
{
rs.absolute(i);
System.out.println(rs.getString(1) + "\t"
+ rs.getString(2) + "\t" + rs.getString(3));
// 修改记录指针所有记录、第2列的值
rs.updateString(2, "学生名" + i);
// 提交修改
rs.updateRow();
}
}
}
public static void main(String[] args) throws Exception
{
var rt = new ResultSetTest();
rt.initParam("mysql.ini");
rt.query("select * from student_table");
}
}使用ResultSetMetaData分析结果集
如果程序需要了解ResultSet里包含哪些数据列,以及每个数据列的数据类型,可以通过ResultSetMetaData来获取关于ResultSet的描述信息。
ResultSet里包含一个getMetaData()方法,该方法返回该ResultSetMetaData对象,然后通过ResultSetMetaData提供的方法返回ResultSet的描述信息。常有方法有如下三个:
函数原型 功能 参数 int getColumnCount() 返回该ResultSet的列的数量 无 String getColumnName(int column) 返回指定索引的列名 column:指定索引 int getColumnType(int column) 返回指定索引列类型 column:指定索引 使用RowSet 1.1 包装结果集
RowSet接口继承了ResultSet接口,RowSet接口包括JdbcRowSet、CachedRowSet、FilteredRowSet、JoinRowSet和WebRowSet常用子接口,其中JdbcRowSet需要保持与数据库的连接之外,其余四个子接口都是离线的RowSet,不需要保持与数据库的连接。
RowSet默认是可滚动、可更新、可序列化的结果集,对于离线的RowSet而言,程序在创建RowSet时已经把数据从底层数据库读取到了内存中,因此可以充分利用计算机的内存,从而降低数据库服务器的负载。
RowSetFactory与RowSet
RowSetProvider类负责创建RowSetFactory,而RowSetFactory提供以下方法创建RowSet实例。
- CachedRowSet createCachedRowSet():创建一个默认的CachedRowSet。
- FilterRowSet createFilterRowSet():创建一个默认的FilterRowSet