本文共 2892 字,大约阅读时间需要 9 分钟。
ResultSet用来从查询语句中获取结果。对ResultSet的操作是反应到数据库游标(cursor)上的。
ResultSet可从三方面分类,分别是Types,Concurrency ,Holdability
从两个方面分类 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.CONCUR_READ_ONLY
: 结果集是只读的 ResultSet.CONCUR_UPDATABLE
: 结果集是可以更新的 这个属性是关于事务提交后, 是否需要关闭结果集。
HOLD_CURSORS_OVER_COMMIT
: 当调用 Connection.commit()后, ResultSet 将不会关闭, 一般用于只读的结果集中. CLOSE_CURSORS_AT_COMMIT
: 当调用 Connection.commit()后, ResultSet 将会关闭 可以使用Connection的createStatement方法指定:
Statement createStatement(int resultSetType, int resultSetConcurrency);Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability);
也有生成PreparedStatement,CallableStatement类似的方法。
一个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会被关闭:
1. 当执行ResultSet#close方法时候。 2. 创建该ResultSet的Statement和Connection被关闭时候。 3. Statement被重新执行。 4. Statement指定了CLOSE_CURSORS_AT_COMMIT,并提交。转载地址:http://ashgi.baihongyu.com/