当用于显示一张表或查询结果的可视化数据显示时,ResultSet类中的next方法无法满足在结果集上前后移动。
6.1 可滚动的结果集
Statment : Statment stmt = conn.createStatment(type, concurrency);
PreparedStatement : PreparedStatement prepStmt = conn.prepareStatement(command, type, concurrency);
ResultSet的type值
TYPE_FORWARD_ONLY 结果集不能滚动
TYPE_SCROLL_INSENSITIVE 结果集可以滚动,但对数据库的变化不敏感
TPYE_SCROLL_SENSITIVE 结果集可以滚蛋,且对数据库的变化敏感
ResultSet的Concurrency值
CONCUR_READ_ONLY 结果集不能用于更新数据库(默认值)
CONCUR_UPDATABLE 结果集可以用于更新数据库
e.g.如果只想滚动遍历结果集,而不想编辑它的数据
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet result = stmt.executeQuery(query);
这样得到的ResultSet结果集都将是可滚动的。
注意 :
(1)可滚动的结果集只有一个光标,用以指示当前位置。
(2)并非所有的数据库驱动程序都支持可滚动和可更新的结果集。通过conn.getMetaData()返回的DatabaseMetaData类中的supportsResultSetType(int type)和supportsResultSetConcurrency(int type, int concurrency)方法,可以知道特定的驱动程序是否支持哪些结果集。
(3)即使是数据库支持所有的结果集,某个特定的查询也有可能无法产生带有所有请求的所有属性的结果集(比如,一个复杂的查询结果,就有可能是不可更新的),此时executeQuery方法将返回一个功能较少的ResultSet对象,并添加一个SQLWaring给连接对象。
(4)也可以使用ResultSet类中的getType和getConcurrency方法查看结果集实际支持的模式。
(5)如果不进行检查并发起一个不支持的操作,比如对不可滚动的结果集调用previous,将抛出SQLException异常。
在结果集上进行滚动:
(1)boolean previous() : 将光标移动到此 ResultSet 对象的上一行。 如果游标位于一个实际位置返回true,如果位于第一行之前,返回false。
(2)boolean relative(int rows) : 按相对行数(或正或负)移动光标。正数为向下滚动游标,负数为向上滚动游标。调用方法 relative(1) 等效于调用方法 next(),而调用方法 relative(-1) 等效于调用方法 previous(),调用 relative(0) 有效,但是不更改光标位置。如果光标位于行上,则返回 true;否则返回 false。
(3)boolean absolute(int row) : 将光标移动到此 ResultSet 对象的给定行编号。
(4)int getRow() : 获取当前行编号。结果集中第一行的行号为1,如果不存在当前行,则返回 0,即不在任何行上。
(5)boolean first : 将光标移动到此 ResultSet 对象的第一行。
boolean last : 将光标移动到此 ResultSet 对象的最后一行。
void beforeFirst() : 将光标移动到此 ResultSet 对象的开头,正好位于第一行之前。
void afterLast() : 将光标移动到此 ResultSet 对象的末尾,正好位于最后一行之后。
(6)boolean isFirst() : 获取光标是否位于此 ResultSet 对象的第一行。
boolean isLast() : 获取光标是否位于此 ResultSet 对象的最后一行。
boolean isBeforeFirst() : 获取光标是否位于此 ResultSet 对象的第一行之前。
boolean isAfterLast() : 获取光标是否位于此 ResultSet 对象的最后一行之后。
6.2 可更新结果集
如果希望编辑结果集中的数据,并且将结果集上的数据变更自动反映到数据库中,那么就必须使用可更新的结果集。可更新的结果集并不一定是可滚动的,但如果将数据提供给用户去编辑,那么通常也会希望结果集是可滚动的。
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
这样调用executeQuery方法返回的结果集就是可更新的结果集。
注意 :
(1)并非所有的查询都会返回可更新的结果集。如果查询涉及多张表的连接操作,那么它所产生的结果集将是不可更新的。
(2)如果查询只涉及一张表,或在查询时是使用主键连接多个表格,那么产生的结果集将是可更新的结果集。
(3)通过调用ResultSet类中的getConcurrency concurrency方法来确定结果集是否是可更新的。
更新
(1)所有对应于SQL类型的数据类型都配有updateXXX方法,比如updateDouble、updateString等。使用方式与getXXX相同,必须指定列的名称或序号。
(2)updateXXX方法只是改变结果集中的行集,而非数据库中的值。当更新完行中的字段值后,必须调用updateRow方法,该方法将当前行中所有更新信息发送给数据库。
(3)如果没有调用updateRow方法就将光标移动到其他行上,那么所有的更新信息都将被行集丢弃,而且永远不会传递给数据库。
(4)可以调用cancelRowUpdates方法来取消对当前行的更新。
添加
(1)使用moveToInsertRow方法将光标移动到特定的位置,称之为插入行(insert row)。
(2)调用updateXXX方法在插入行的位置上创建一个新的行。
(3)调用insertRow方法将新建的行发送给数据库。
(4)完成插入操作后,调用moveToCurrentRow方法将光标移回到调用moveToInsertRow方法之前的位置。
e.g.通过可更新集插入一条数据。
rs.moveToInsertRow();
rs.updateString("name", name);
rs.updateInt("age", age);
rs.insertRow();
rs.moveToCurrentRow();
注意:
(1)无法控制在结果集或数据库中添加新数据的位置。
(2)对于在插入行中没有指定值的列,将被设置为SQL的null。但,如果这个列有NOT NULL约束,那么将抛出异常,并且改行插入失败。
删除
deleteRow方法会立即将该行从结果集和数据库中删除
e.g.立即删除结果集合数据库中的当前行
rs.deleteRow();
结果集中需要的注意事项:
(1)ResultSet类中的updateRow、insertRow和deleteRow方法的执行效果等同于SQL命令中的UPDATE、INSERT和DELETE。
(2)需要小心处理结果集,否则在使用可更新的结果集时编写非常低效的代码。
(3)执行UPDATE语句,要比建立一个查询,然后一边遍历一边修改数据显的高效的多(减少了连接数据库的次数)。
(4)对大多数的程序性的修改而言,使用SQL的UPDATE语句更合适一些。
(5)JDBC2中对结果集做了进一步的改进,例,如果数据被其他的并发数据库连接所修改,那么它可以用最新的数据来更新结果集。
(6)JDBC3中添加了另一种优化,可以指定结果集在事物提交时的行为。
分享到:
相关推荐
在深入本章节之前,我们先来了解Java数据库编程的基本概念和知识点,本章节主要涉及Java数据库连接(JDBC)的高级特性,包括通用SQL客户端的创建、SQL语句的批处理执行、可滚动和可更新结果集的处理、使用RowSet简化...
(3)掌握可滚动和可更新的结果集的基本操作方法; (4)理解JDBC中实现事务处理的基本方法; (5)理解数据库连接池的基本原理和思想,学会在tomcat服务器中配置数据库连接池,并掌握从连接池中获取连接的基本方法...
在 Oracle 数据库中,不支持结果集滚动,这意味着开发者不能使用可滚动结果集来查询大量数据。但是,开发者可以使用 JDBC 自己支持的结果集滚动来实现可滚动结果集。结果集滚动需要在内存中高度缓存大量数据,许多...
- `rs.updateRow()`:更新结果集中的当前行,并将更改同步到数据库。 使用这些方法,开发者可以在ResultSet对象中进行数据的读取、定位、插入、删除和更新,实现灵活的数据操作。注意,不是所有ResultSet都支持...
这通过设置`Statement`的`ResultSetConcurrency`和`ResultSetType`属性实现,例如,`ResultSet.TYPE_SCROLL_INSENSITIVE`和`ResultSet.CONCUR_UPDATABLE`组合可以创建一个可滚动且可更新的结果集。 批处理更新...
`RecyclerView`是Android SDK中的一个强大组件,用于展示可滚动的数据集,而在这里我们将对其进行扩展,以满足特定的设计需求。 首先,我们要创建一个自定义的`LayoutManager`。`LayoutManager`负责管理`...
在“仿分页”实现中,JTable可能被用来显示数据集的一个“页面”,当用户滚动滚动条时,JTable会显示数据集的下一“页面”。 JScrollPane是Swing提供的一种容器,它能够添加一个可滚动的视图,如JTable。...
1. **RecyclerView基本概念**:RecyclerView是一个可滚动的视图容器,用于显示大量数据集。它比ListView更强大,因为它支持多种视图类型,可以通过自定义ItemDecoration和ItemAnimator实现更丰富的动画效果。 2. **...
在Android开发中,RecyclerView是一种非常常用的布局管理器,用于展示可滚动的数据集。它具有高效、灵活和可定制的特点,可以实现多种复杂布局。在给定的标题和描述中,我们关注的是如何将RecyclerView实现上下自动...
然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...
然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...
然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...
本篇文章将深入探讨如何在Android中创建一个可水平滚动的ListView,同时提供一些关键知识点。 首先,我们要明白,Android原生的ListView并不支持水平滚动。要实现这个功能,我们需要使用HorizontalScrollView或者...
对于滚动显示,我们需要了解控制器的命令集,例如设置显示区域、清屏、光标移动等。 3. **点阵字体库**:为了在LCD上显示汉字,我们需要一个包含各种汉字的点阵字体库。每个汉字由一定数量的像素点组成,这些点对应...
这里主要介绍两种方法:常规结果集和可滚动结果集。 首先,分页显示是解决大数据量查询时避免一次性加载所有数据到内存中的有效手段。在Java中,我们通常使用JDBC(Java Database Connectivity)来实现这一功能。...
2. **JavaScript控制**:通过监听滚动事件,计算滚动的距离并相应地更新每个滚动层的位置。JavaScript库提供了便捷的方法来处理这些复杂的计算,同时还可以添加交互,如锚点链接、自动滚动、触屏支持等功能。 3. **...
` 创建一个可以滚动并更新结果集的Statement对象。 6. **执行SQL语句**:`String sql="select * from test"; ResultSet rs=stmt.executeQuery(sql);` 执行查询语句并获取结果集。 7. **处理结果集**:`while(rs....
在Android开发中,RecyclerView是一个非常重要的组件,它用于展示可滚动的数据集,具有高效和灵活的特性。在实际应用中,我们可能需要对RecyclerView进行定制,例如添加边框、实现循环滚动以及设置圆角的item。本文...