本文主要是介绍【JDBC4.2】ResultSet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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,并提交。
这篇关于【JDBC4.2】ResultSet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!