`

(六) 可滚动和可更新的结果集

 
阅读更多

当用于显示一张表或查询结果的可视化数据显示时,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中添加了另一种优化,可以指定结果集在事物提交时的行为。

分享到:
评论

相关推荐

    JDBC数据库编程实验

    (3)掌握可滚动和可更新的结果集的基本操作方法; (4)理解JDBC中实现事务处理的基本方法; (5)理解数据库连接池的基本原理和思想,学会在tomcat服务器中配置数据库连接池,并掌握从连接池中获取连接的基本方法...

    JDBC API教程与参考手册part4

    然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...

    JDBC API教程与参考手册part3

    然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...

    JDBC API教程与参考手册part2

    然后,本书转向更高级的主题,集中介绍JDBC 3.0API的一些高级功能,如可滚动和可更新的结果集、批量更新、SQL99数据类型、定制映射、保存点、语句池以及自动生成键等。 除了深入介绍JDBC元数据API之外,本书还给出了...

    jtds.jdbc.Driver ,连接 SQL Server 所需驱动

    jTDS是一个开放源代码的100%纯Java实现的JDBC3.0驱动, 它用于连接 Microsoft SQL Server(6.5,7,...jTDS完全与JDBC3.0兼容,支持只向前和可滚动/可更新的结果集(ResultSets),并且支持完全独立的并行Statements

    jtds-1.2.jar

    jTDS完全与JDBC3.0兼容,支持只向前和可滚动/可更新的结果集(ResultSets),并且支持完全独立的并行Statements, 而且实现了所有的数据库元数据(Database MetaData)和结果集元数据(ResultSet MetaData)方法。

    jtdsJDBC Driver

    JTDS完全与JDBC 3.0兼容,支持只向前的,和可滚动/可更新的结果集(ResultSets)中并行(完全独立)语句,并且可实施所有databasemetadata和resultsetmetadata方法。 文件有说明spring+hibernate+c3p0+jtds的配置

    sasquatch:适用于Java的SAS数据集库

    关键点: 设计为轻型图书馆Java 8最低要求有一个模块信息,使其与兼容特征: 从SAS数据集中读取元数据和数据(* .sas7bdat) 使用3种游标浏览数据:仅前进,可滚动和可拆分与Java Stream API兼容提供一个简单的外观...

    Java核心技术II(第8版)

    4.6 可滚动和可更新的结果集 4.6.1 可滚动的结果集 4.6.2 可更新的结果集 4.7 行集 4.7.1 被缓存的行集 4.8 元数据 4.9 事务 4.9.1 保存点 4.9.2 批量更新 4.9.3 高级SQL类型 4.10 Web与企业应用中的连接管理 4.11 ...

    简单的命令行实用程序,可将CSV文件转换为可搜索和可排序HTML表。-Python开发

    支持大型数据集和大量列的水平滚动。 演示这是一个示例csv fi CSVtoTable简单命令行实用工具的演示,它将CSV文件转换为可搜索和可排序HTML表。 支持大型数据集和大量列的水平滚动。 演示这里是将示例csv文件转换为...

    JDBC笔记 JDBC笔记

    同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了...

    bootstrap3 多用途产品展示html模板Nigo

    可以用于任何业务或产品展示,你可以用它来摄影工作室,创业机构,作品集模板,为个人,企业,软件应用等。 主要特色 10 +主页演示 Bootstrap3 x响应。 图标字体、离子图标和Et-line字体图标。 粘头菜单。 光滑的视差滚动...

    matlab代码中fnames-matlabtools:Matlab工具集的集合,包括HDR图像查看器

    可缩放和可滚动轴: zoomaxes() mex_auto() -免提,按需mex编译 每次更改C / C ++代码后,都厌倦了手动调用mex或寻找构建脚本吗? 添加一个简单的m脚本作为通用包装,并在其中调用mex_auto() : % bla.m function ...

    michaeldmoore-multistat-panel:具有固定的,更新的行(或列)的智能表显示面板

    michaeldmoore-multistat-panel 新版本(1.3.0)-现在具有基于规则的栏重新着色! 新版本(1.4.0)-现在具有重新...Multistat基于此基础,但具有多列表数据集,以带有可选的上,下硬限制的条形图形式显示查询数据。

    Java2核心技术.part5

    4.6 可滚动和可更新的结集 4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 ...

    Java2核心技术.part3

    4.6 可滚动和可更新的结集 4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 ...

    Java2核心技术.part1

    4.6 可滚动和可更新的结集 4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 5.5 服务器...

    Java2核心技术.part6

    4.6 可滚动和可更新的结集 4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 ...

    Java2核心技术.part4

    4.6 可滚动和可更新的结集 4.7 元数据 4.8 行集 4.9 事务 4.10 高级连接管理 4.11 LDAP概述 第5章 分布式对象 5.1 客户与服务器的角色 5.2 远程方法调用 5.3 配置远程方法调用 5.4 远程方法中的参数传递 ...

Global site tag (gtag.js) - Google Analytics