【JDBC4.2】ResultSet

本文详细介绍了Java JDBC中的ResultSet,包括其类型、并发性和保持性,并提供了如何创建和操作ResultSet的具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ResultSet用来从查询语句中获取结果。对ResultSet的操作是反应到数据库游标(cursor)上的。

1.ResultSet分类

ResultSet可从三方面分类,分别是Types,Concurrency ,Holdability

ResultSet Types

从两个方面分类 1.操作的光标方式 2.数据库并发数据修改后ResultSet 的反馈。

ResultSet.TYPE_FORWARD_ONLY :Cursor 只能往前移动, 默认值
ResultSet.TYPE_SCROLL_INSENSITIVE: Cursor 可以前后移动, 但是对于数据库的改动不关心.
ResultSet.TYPE_SCROLL_SENSITIVE: Cursor 可以前后移动, 并且当数据库发生改动(仅update)的时候, ResultSet也会随之更新。
推荐这篇文章——文章链接,详细介绍了ResultSet.TYPE_SCROLL_SENSITIVE,但要注意 : mysql是不支持ResultSet.TYPE_SCROLL_SENSITIVE的!,可以使用Ms-SqlServer等其他DB测试。

DatabaseMetaData#supportsResultSetType(int ResultSetType) 可以测试你使用的数据库支持哪些ResultSet Types

ResultSet Concurrency

用来描述我们是否可以更新结果集中的数据到数据库. 有两个值可以用:
ResultSet.CONCUR_READ_ONLY: 结果集是只读的
ResultSet.CONCUR_UPDATABLE: 结果集是可以更新的

Cursor Holdability

这个属性是关于事务提交后, 是否需要关闭结果集。
HOLD_CURSORS_OVER_COMMIT: 当调用 Connection.commit()后, ResultSet 将不会关闭, 一般用于只读的结果集中.
CLOSE_CURSORS_AT_COMMIT : 当调用 Connection.commit()后, ResultSet 将会关闭

指定ResultSet Types/Concurrency /Holdability

可以使用Connection的createStatement方法指定:

Statement createStatement(int resultSetType, int resultSetConcurrency);
Statement createStatement(int resultSetType, int resultSetConcurrency,                              int resultSetHoldability);

也有生成PreparedStatement,CallableStatement类似的方法。

2.创建和操作ResultSet

游标

一个ResultSet包含了一个游标,当ResultSet被创建的时候,游标位于第一行数据的前面。ResultSet的一些方法对应了游标的移动:

ResultSet方法解释
boolean next()该方法的作用是将数据库游标向前移动一位,使得下一行成为当前行,当刚刚打开记录集对象时,数据库游标的位置在记录集的最前面,第一次使用next()方 法将会使数据库游标定位到记录集的第一行,第二次使用next()方法将会使数据库游标定位到记录集的第二行,以此类推。
boolean previous()该方法的作用是将数据库游标向后移动一位,使得上一行成为当前行.
boolean first()该方法的作用是将当前行定位到数据库记录集的第一行。
boolean last()该方法的作用刚好和first()方法相反
void beforeFirst()该方法的作用是将数据库游标移到记录集的最前面,位于记录集第一行的前面,如果记录集不包含任何的行该方法不产生作用。
void afterLast()该方法的作用是将数据库游标移到记录集的最后,位于记录集最后一行的后面,如果该记录集不包含任何的行该方法不产生作用。
boolean absolute(int row)该方法的作用是将记录集中的某一行设定为当前行,亦即将数据库游标移动到指定的行,参数row 指定了目标行的行号,这是绝对的行号,由记录集的第一行开始计算不是相对的行号.
boolean relative(int rows)该方法的作用也是将记录集中的某一行设定为当前行,但是它的参数rows 表示目标行相对于当前行的行号。

获取值

根据列顺序获取(顺序号从1开始):

while (resultSet.next()){
     System.out.println(resultSet.getString(1)+"\t"+resultSet.getInt(2));
}

根据列名称获取:

while (resultSet.next()){
    System.out.println(resultSet.getString("name")+"\t"+resultSet.getInt("age"));
}

根据列名称获取顺序号:

int nameIndex = resultSet.findColumn("name");//返回1
int weightIndex = resultSet.findColumn("weight");//抛出异常

注意:根据列名称获取一般先通过findColumn来获取顺序号,然后再根据列顺序获取得列值。所以在性能要求高的时候,尽量根据列顺序获取列值,当然,这降低了可读性。

修改

如果创建Statement时候制订了ResultSet.CONCUR_UPDATABLE,则通过ResultSet可以修改表数据。

修改:

resultSet.next();
resultSet.updateString("name","XXXXXX");
resultSet.updateRow();

同样,ResultSet也可以删除数据,对应的方法有ResultSet#deleteRow();
插入一行演示:

resultSet.moveToInsertRow();
resultSet.updateString(1, "XiaoMing");
resultSet.updateInt(2, 25);
resultSet.insertRow();

关闭ResultSet

下列情况下,ResultSet会被关闭:
1. 当执行ResultSet#close方法时候。
2. 创建该ResultSet的Statement和Connection被关闭时候。
3. Statement被重新执行。
4. Statement指定了CLOSE_CURSORS_AT_COMMIT,并提交。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值