博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JDBC4.2】ResultSet
阅读量:4290 次
发布时间:2019-05-27

本文共 2892 字,大约阅读时间需要 9 分钟。

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");//返回1int 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,并提交。

转载地址:http://ashgi.baihongyu.com/

你可能感兴趣的文章
逆序链表
查看>>
epoll 使用详解
查看>>
stl 中 set容器用法
查看>>
有序数组求交集
查看>>
文字常量区与栈
查看>>
非阻塞connect 编写方法
查看>>
epoll 边沿触发
查看>>
String类 默认生成的函数
查看>>
Linux 软连接与硬链接
查看>>
视音频数据处理入门:H.264视频码流解析
查看>>
视音频数据处理入门:AAC音频码流解析
查看>>
视音频数据处理入门:UDP-RTP协议解析
查看>>
视音频数据处理入门:FLV封装格式解析
查看>>
最简单的基于FFMPEG的封装格式转换器(无编解码)
查看>>
base64 编码原理
查看>>
单链表是否有环的问题
查看>>
判断两个链表是否相交并找出交点
查看>>
归并排序
查看>>
STL常见问题
查看>>
time_wait和close_wait状态
查看>>