1、可滚动的结果集(Scrollable Result Sets)
(1)创建可滚动的结果集:
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet.TYPE_FORWARD_ONLY:结果集是不能滚动的;他的游标只能向前移动;
ResultSet.TYPE_SCROLL_INSENSITIVE
:结果是可滚动的;游标可以向前也可以后退。也可以移动到一个绝对位置。
ResultSet.
TYPE_SCROLL_SENSITIVE:结果是可滚动的;游标可以向前也可以后退。也可以移动到一个绝对位置。
ResultSet.CONCUR_READ_ONLY:结果集是只读的。
ResultSet.ResultSet.CONCUR_UPDATABLE
:结果集是可以更新的。
ResultSet srs = stmt.executeQuery("SELECT COF_NAME,
PRICE FROM COFFEES");
尽管我们可以在这里设置创建的是可滚动结果集,但是如果厂商的JDBC实现不支持,我们获取到的结果将不具有可滚动属性。
可以使用ResultSet.getType()方法来获取是否支持滚动:
int type = rs.getType();
The variable type
will be one of the following:
1003
to indicate ResultSet.TYPE_FORWARD_ONLY
1004
to indicate ResultSet.TYPE_SCROLL_INSENSITIVE
1005
to indicate ResultSet.TYPE_SCROLL_SENSITIVE
TYPE_SCROLL_INSENSITIVE和TYPE_SCROLL_SENSITIVE的主要区别是在如果发生改变他们的敏感度。前一个将不会很敏感后一个则会。
(2)移动游标,使用以下方法可以移动游标:
rs.next();
rs.previous();
rs.absolute();
rs.relative();
rs.first();
rs.last();
rs.beforeFirst();
rs.afterLast();
使用rs.getRow()获取游标当前行。
rs.isAfterLast();
rs.isBeforeFirst();
rs.isLast();
rs.isFirst();
rs.hasNext();
等等方法。
2、更新结果集
(1)创建可以更新的结果集
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet uprs = stmt.executeQuery(
"SELECT COF_NAME,
PRICE FROM COFFEES");
在JDBC 2.0中,我们可以向可以更新的结果集中插入行或删除行,或者修改其中的行。
下面的方法用于判断结果集是否可以更新:
int concurrency = uprs.getConcurrency();
The variable concurrency
will be one of the following:
1007
to indicate ResultSet.CONCUR_READ_ONLY
1008
to indicate ResultSet.CONCUR_UPDATABLE
(2)更新结果集
JDBC 1.0中可以这样更新:
stmt.executeUpdate(
"UPDATE COFFEES SET PRICE = 10.99 " +
"WHERE COF_NAME = 'French_Roast_Decaf'");
在JDBC2.0中。则可以:
uprs.last();
uprs.updateFloat("PRICE", 10.99f);
uprs.updateRow();
在移动游标前,必须先调用updateRow方法。否则更新信息会丢失。调用cancelRowUpdates可以取消对行的更新。
(3)向结果集中插入或者删除行
Connection con = DriverManager.getConnection(
"jdbc:mySubprotocol:mySubName");
Statement stmt = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
ResultSet uprs = stmt.executeQuery(
"SELECT * FROM COFFEES");
uprs.moveToInsertRow();
uprs.updateString("COF_NAME", "Kona");
uprs.updateInt("SUP_ID", 150);
uprs.updateFloat("PRICE", 10.99f);
uprs.updateInt("SALES", 0);
uprs.updateInt("TOTAL", 0);
uprs.insertRow();
在移动游标前,必须要先调用insertRow否则插入的信息将丢失。
uprs.absolute(4);
uprs.deleteRow();
删除行。
(4)查看结果集中的变化(其实就是说了一个意思,用TYPE_SCROLL_SENSITIVE
对数据很敏感,一旦数据变化就会反映在ResultSet中)
Result sets vary greatly in their ability to reflect changes made in their underlying data. If you modify data in a ResultSet
object, the change will always be visible if you close it and then reopen it during a transaction. In other words, if you re-execute the same query after changes have been made, you will produce a new result set based on the new data in the target table. This new result set will naturally reflect changes you made earlier. You will also see changes made by others when you reopen a result set if your transaction isolation level makes them visible.
So when can you see visible changes you or others made while the ResultSet
object is still open? (Generally, you will be most interested in the changes made by others because you know what changes you made yourself.) The answer depends on the type of ResultSet
object you have.
With a ResultSet
object that is TYPE_SCROLL_SENSITIVE
, you can always see visible updates made to existing column values. You may see inserted and deleted rows, but the only way to be sure is to use DatabaseMetaData
methods that return this information. ("New JDBC 2.0 Core API Features" on page 371 explains how to ascertain the visibility of changes.)
You can, to some extent, regulate what changes are visible by raising or lowering the transaction isolation level for your connection with the database. For example, the following line of code, wherecon
is an active Connection
object, sets the connection's isolation level to TRANSACTION_READ_COMMITTED
:
con.setTransactionIsolation(
Connection.TRANSACTION_READ_COMMITTED);
With this isolation level, a TYPE_SCROLL_SENSITIVE
result set will not show any changes before they are committed, but it can show changes that may have other consistency problems. To allow fewer data inconsistencies, you could raise the transaction isolation level to TRANSACTION_REPEATABLE_READ
. The problem is that, in most cases, the higher the isolation level, the poorer the performance is likely to be. And, as is always true of JDBC drivers, you are limited to the levels your driver actually provides. Many programmers find that the best choice is generally to use their database's default transaction isolation level. You can get the default with the following line of code, where con
is a newly-created connection:
int level = con.getTransactionIsolation();
The explanation of Connection
fields, beginning on page 347, gives the transaction isolation levels and their meanings.
If you want more information about the visibility of changes and transaction isolation levels, see "What Is Visible to Transactions" on page 597.
In a ResultSet
object that is TYPE_SCROLL_INSENSITIVE
, you cannot see changes made to it by others while it is still open, but you may be able to see your own changes with some implementations. This is the type of ResultSet
object to use if you want a consistent view of data and do not want to see changes made by others.
分享到:
相关推荐
了解并熟练运用这些JDBC高级特性,可以显著提升数据库操作的效率和代码的健壮性,尤其是在处理大量数据或复杂业务逻辑时。在实际开发中,根据项目需求和性能优化的需求,合理选择和使用这些特性是非常重要的。
### JDBC高级特性 1. **批处理**:通过`Statement.addBatch()`方法添加多个SQL语句到批处理队列,然后一次性执行,提高效率。 2. **CallableStatement**:用于调用数据库存储过程,支持输入、输出、输入/输出参数...
**二、JDBC高级特性** 1. **结果集处理**: `ResultSet`对象表示查询的结果,可以通过`next()`方法遍历行,通过列索引或列名获取数据。 2. **事务管理**: 使用`conn.setAutoCommit(false)`关闭自动提交,通过`conn....
在实际开发中,我们还会涉及到事务管理、批处理操作、预编译的SQL语句(提高性能和安全性)、异常处理等JDBC高级特性。同时,对于大型应用,可能需要考虑使用连接池来优化数据库连接的管理和释放。 总的来说,JDBC...
8. **第八讲:JDBC高级特性** - ResultSet的滚动和分页:学习如何在ResultSet中进行向前滚动和分页操作。 - 自动关闭资源:使用try-with-resources语句自动关闭数据库资源。 9. **第九讲:JDBC与ORM框架** - ORM...
6. **JDBC高级特性** - **CallableStatement**: 调用数据库存储过程。 - **批处理结果集**: 获取批处理操作的结果,如影响行数。 - **游标**: 使用ResultSet的absolute()和relative()方法移动游标,实现复杂查询...
5. **JDBC高级特性** - Connection池:提高应用性能,避免频繁创建和关闭连接。 - PreparedStatement:预编译的SQL语句,提高执行效率,防止SQL注入。 - CallableStatement:用于调用存储过程。 -事务处理:`...
### 五、JDBC高级特性 1. **JDBC批处理API增强**: JDBC 4.0引入了批处理异常处理,可以单独处理每个失败的批处理命令。 2. **RowSet**: 支持离线处理和缓存,如CachedRowSet,可以在没有连接的情况下操作数据。 3...
**JDBC高级特性** 1. **事务管理**:JDBC支持事务的概念,可以控制一组数据库操作作为一个逻辑单元,确保它们要么全部成功,要么全部失败。常用的方法有`setAutoCommit(false)`来禁用自动提交,`commit()`提交事务...
**第三天:JDBC高级特性** 在day03的学习中,将探讨CallableStatement用于调用存储过程的方法,以及ResultSetMetaData对象,用于获取结果集元数据。还会涉及事务管理,包括手动开启、提交、回滚事务,以及隔离级别的...
本资料包可能包含了深入讲解Java JDBC高级特性和实践技巧的多个章节。 章节分布如下: 1. **chap1**:可能涵盖了JDBC的基础知识,包括JDBC驱动类型、DataSource接口、Connection对象的获取以及数据库连接的关闭。...
这份教材可能涵盖了这些基础内容,并且深入讲解了如何处理批处理、预编译的`PreparedStatement`、游标、存储过程以及JDBC连接池的使用,这些都是JDBC高级特性和最佳实践。 在实际开发中,JDBC常被用于数据导入导出...
**JDBC高级特性**: - **批处理**:允许一次性发送多个SQL语句,提高性能。 - **CallableStatement**:用于调用存储过程。 - **连接池**:通过管理数据库连接的复用,提升系统性能。 - **事务管理**:JDBC支持ACID...
#### 六、JDBC高级特性 除了基本的连接和查询操作外,JDBC还支持一些高级特性: 1. **批处理**:允许一次执行多条SQL语句,提高了执行效率。 2. **存储过程**:可以通过`CallableStatement`调用数据库中的存储过程...
JDBC高级特性** - **PreparedStatement**:预编译的SQL语句,可防止SQL注入,提高性能,允许使用占位符(问号)来多次执行相同但参数不同的SQL。 - **CallableStatement**:用于执行存储过程,支持IN、OUT、IN/...
3. **JDBC高级特性**: - PreparedStatement:预编译的SQL语句,防止SQL注入,提高性能。 - CallableStatement:用于调用数据库存储过程。 - Connection池:管理数据库连接,提高效率,例如C3P0、HikariCP。 -...
#### 五、JDBC高级特性 除了基本的`Statement`接口外,JDBC还提供了更高级的接口,如`PreparedStatement`和`CallableStatement`,它们提供了参数化的SQL语句支持,可以提高应用程序的安全性和性能。 ##### 1. ...
9. **JDBC高级特性**:包括CallableStatement处理存储过程,以及ResultSetMetaData获取查询结果的元数据。 10. **最佳实践**:如何编写健壮的JDBC代码,避免潜在的问题,提高代码的可读性和维护性。 这个资源包...
7. **JDBC高级特性** - ResultSetMetaData:提供关于ResultSet列的信息。 - CallableStatement:用于调用数据库的存储过程。 - Savepoint:在事务中设置保存点,可以回滚到特定点。 - DatabaseMetaData:提供...