- 浏览: 255553 次
- 性别:
- 来自: 福州
文章分类
最新评论
-
sflscar:
太好了,我搞了一下午,批量插入,第一个参数个数没对sql批量导 ...
redis pipe大数据量导入 -
赵青青:
那 entity.hbm.xml 文件中的主健策略怎么配置 ...
Hibernate 和 Access -
GapStar:
换成flash IconCellRenderer.as应该怎么 ...
DataGrid 中加入图标 -
binbinyouli:
不好意思。我把楼主注释掉得部分打开了。但是我看楼主有传递对象的 ...
Flex Flash 和JAVA 在Socket交互 -
binbinyouli:
不知道前两位评论人时怎么做得。我再做这个例子的时候出现了安全沙 ...
Flex Flash 和JAVA 在Socket交互
清单 24. 清单 23 中的代码执行结果
1 Tom Tom is VIP. 2 Jim null
下面一节里我们将会看到 JdbcRowSet 如何作为一个 RowSet 和其他的 RowSet 一起使用。
使用 JoinRowSet
支持的联合方式
JoinRowSet 接口中对五种不同的联合方式都定义了对应的常数和判断该实现是否支持的方法,如下表所示。
表 5. 五种联合方式
联合方式 对应的常数 判断是否支持的方法(返回布尔值)
内连接(INNER JOIN) JoinRowSet.INNER_JOIN supportsInnerJoin()
左外连接(LEFT OUTER JOIN) JoinRowSet.LEFT_OUTER_JOIN supportsLeftOuterJoin()
右外连接(RIGHT OUTER JOIN) JoinRowSet.RIGHT_OUTER_JOIN supportsRightOuterJoin()
全外连接(FULL OUTER JOIN) JoinRowSet.FULL_JOIN supportsFullJoin()
交叉连接(CROSS JOIN) JoinRowSet.CROSS_JOIN supportsCrossJoin()
同时还有两个方法,getJoinType() 返回当前的联合方式,setJoinType(int) 设置联合方式。值得注意的是,Java 5 和 Java 6 中都支持内连接 (INNER JOIN) 这一种联合方式。在 setJoinType 方法中传入除 Inner_Join 以外的任何一种联合方式都会抛出 UnsupportedOperationException 的异常。
另外一点需要注意的,虽然默认的联合方式就是内连接,但是在没有显示的调用 setJoinType() 之前调用 getJoinType() 会抛出 ArrayIndexOutOfBoundsException 的异常。 所以一般来讲,我们可以不需要调用这几个方法而直接认为 JoinRowSet 默认并且只允许的联合方式就是内连接(INNER JOIN)。
如何联合各种 RowSet
联合多个 RowSet 的方法其实就是往一个 JoinRowSet 里调用 add 方法添加其他 RowSet(这个 RowSet 可以是上面提到的五种 RowSet 中的任意一种,包括离线操作的 JdbcRowSet 和 JoinRowSet 本身)的过程。添加一个 RowSet 的同时也必须制定联合时匹配的列。JoinRowSet 接口中提供了以下几个 add 方法:
addRowSet(Joinable rowset)
addRowSet(RowSet[] rowset, int[] columnIdx)
addRowSet(RowSet[] rowset, String[] columnName)
addRowSet(RowSet rowset, int columnIdx)
addRowSet(RowSet rowset, String columnName)
下面是一个联合一个 JdbcRowSet 和一个 CachedRowSet 的简单例子。
清单 25. 使用 JoinRowSet
// 构造一个CachedRowSet并且填充CUSTOMERS表中的数据。
CachedRowSet cachedRS = new CachedRowSetImpl(); cachedRS.setUrl(DBCreator.DERBY_URL); cachedRS.setCommand(DBCreator.SQL_SELECT_CUSTOMERS); cachedRS.execute(); // 构造一个JdbcRowSet并且填充ORDERS表中的数据。 JdbcRowSet jdbcRS = new JdbcRowSetImpl(); jdbcRS.setUrl(DBCreator.DERBY_URL); jdbcRS.setCommand(DBCreator.SQL_SELECT_ORDERS); jdbcRS.execute(); // 把cachedRS添加进新构造的JoinRowSet中。 JoinRowSet joinRS = new JoinRowSetImpl(); joinRS.addRowSet(cachedRS, "ID"); //$NON-NLS-1$ // 下面这条被注释的语句会抛出ClassCastExcepion。 // joinRS.addRowSet(jdbcRS, "ID"); // 把jdbcRS添加进这个JoinRowSet中。 jdbcRS.setMatchColumn("ID"); //$NON-NLS-1$ joinRS.addRowSet(jdbcRS); // 观察结果 printRowSet(joinRS);
清单 26. 清单 25 中的代码执行结果
The data in CachedRowSet: 2 Jim null 1 Compute 1 Tom Tom is VIP. 1 Book
虽然 JoinRowSet 提供了五个不同的 addRowSet 方法,但是对于某些 RowSet,并不是每个方法都能用的。比如当上面添加一个 JdbcRowSet 的时候,你只能调用 addRowSet(Joinable) 这个方法(JdbcRowSet 实现了 Joinable 接口),并且在调用这个方法之前一定要先设置配对的列名或者以 1 为基数的配对列的位置,如下所示。
清单 27. 添加 JdbcRowSet
// 正确的添加一个JdbcRowSet的方法。 jdbcRS.setMatchColumn("ID"); joinRS.addRowSet(jdbcRS);
输出结果表明此时 JoinRowSet 中的数据正是两个 RowSet 中的数据的内联结果。加进去的两个 RowSet 中的”ID”这一列,在 JoinRowSet 中合并成了一列。如果我们查看最后 JoinRowSet 的列名,会发现这一列的列名变成了”MergedCol”, 其它列名不变。这个时候的 JoinRowSet 可以继续添加其他的 RowSet,联合会在 MergedCol 这一列上进行。
清单 28. 查看 JoinRowSet 中列名
for (int i = 1; i <= joinRS.getMetaData().getColumnCount(); i++) { System.out.println(joinRS.getMetaData().getColumnName(i)); }
清单29. 清单 28 中的代码执行结果
MergedCol NAME REMARK USER_ID PRODUCT
JoinRowSet 作为 CachedRowSet 的使用
从前面的继承结构图可以看到,JoinRowSet 继续于 CachedRowSet。因此从理论上来看,JoinRowSet 也可以作为 CachedRowSet 来使用。
但是其实 JoinRowSet 很多方法并不是简单的直接继承 CachedRowSet 中的方法,而是重写(Override)了这些方法。最典型的两个方法是 execute 和 populate。 前面已经提到过,这是两种填充一个 CachedRowSet 的方法。但是对于 JoinRowSet,这两个方法却不起作用,不应该被使用。
另外一个比较特殊的方法是 acceptChanges。当 JoinRowSet 中包含一个 CachedRowSet 的时候,这个方法可以使用,并且效果就相当于在里面的这个 CachedRowSet 里面调用。但是当 JoinRowSet 包含两个或多个 RowSet 的时候,这个方法就不起作用了。这就类似于数据库多表联结后形成的视图(View),一般是不能够进行更新操作的。
应注意的问题
虽然 JoinRowSet 提供了五个不同的 addRowSet 方法,但是并不是对于每个 RowSet 这五个方法都是可行的。这点前面已经提到过。
程序不能依赖 JoinRowSet 中的数据的顺序。JoinRowSet 接口中并没有能够控制连接结果排序的方法。它只能保证最后连接结果的正确性,但不能保证顺序。
当把一个 RowSet 加入到 JoinRowSet 中,这个作为 addRowSet 方法的参数的 RowSet 的指针位置可能发生变化。另外当这个 RowSet 是 JdbcRowSet 的时候,在通过 addRowSet 方法加入之前,如果该 JdbcRowSet 的指针位置发生变化的时候,也会影响联合的结果。请看下面这个例子(假设我们已经像前面一样构造好了一个 CachedRowSet 和一个 JdbcRowSet):
清单 30
// 添加cachedRS. JoinRowSet joinRS = new JoinRowSetImpl(); joinRS.addRowSet(cachedRS, "ID"); // 在添加jdbcRS之前,改变指针的位置。 jdbcRS.next(); jdbcRS.setMatchColumn("ID"); joinRS.addRowSet(jdbcRS); // 观察结果 printRowSet(joinRS);
清单 31. 清单 30 中的代码执行结果
The data in CachedRowSet: 2 Jim null 1 Compute
由于 jdbcRS 在加入之前,指针位置发生了变化,导致联结后的结果不一样了。实际上,由于 jdbcRS 是保持数据库连接的,所以一般只能够进行查看下一条数据的操作,而不能查看已经前面的数据,所以当把一个 JdbcRowSet 加入到 JoinRowSet 中时,我们只相当于对这个 JdbcRowSet 从当前位置开始的数据进行了联结操作,而忽略了处于当前指针位置前面的数据。
那么,对于 CachedRowSet,情况又是怎么样呢?
清单 32
// 添加jdbcRS. JoinRowSet joinRS = new JoinRowSetImpl(); jdbcRS.setMatchColumn("ID"); //$NON-NLS-1$ joinRS.addRowSet(jdbcRS); // 在添加cachedRS之前,改变指针的位置。 cachedRS.last(); joinRS.addRowSet(cachedRS, "ID"); //$NON-NLS-1$ // 结果. 此时JoinRowSet中的数据。 printRowSet(joinRS);
清单 33. 清单 32 中的代码执行结果
The data in CachedRowSet: 2 1 Compute Jim null 1 1 Book Tom Tom is VIP.
由此可见,即使 cachedRS 在加入之前,指针位置发生了变化,也不会影响联结的结果。这是因为 CachedRowSet 是离线的,可以前后滚动查看数据。
结束语
本文介绍了 javax.sql.rowset 包下五个 RowSet 接口的使用,并重点说明了在使用中可能出现的问题。合理利用 RowSet 提供的离线式数据处理功能可以达到事半功倍的效果。
描述 名字 大小 下载方法
本文用到的 Java 示例代码 RowSetDemo.zip 21 KB HTTP
文章出处:http://www.diybl.com/course/3_program/java/javaxl/2008625/128208_7.html
- RowSetDemo.zip (20.4 KB)
- 下载次数: 20
发表评论
-
redis pipe大数据量导入
2015-07-06 18:48 14158由于做性能测试,需要往redis中导出千万 ... -
Tongweb、Tomcat远程调试
2014-04-15 21:01 3552在开发过程中经常需要对布署在远程的程序进行跟踪测 ... -
JAVA中Integer 和 int 的比较
2012-06-17 15:04 804http://topic.csdn.net/u/2012060 ... -
java给图片加水印,文字水印
2010-10-09 10:03 1066package com.newland.bi.tt; i ... -
Struts+jsonplugin
2010-04-19 20:42 1056JSON官方文档 http://www.json.org/j ... -
jsp session 丢失
2010-04-19 20:37 23291.先访问a站点:http://192.168.18.2/te ... -
读取Properties的N种方法
2009-12-14 10:55 911如何读取资源文件:( ... -
Java正则表达式详解(上)
2009-03-28 10:24 919如果你曾经用过Perl或任 ... -
JAVA数据库基本操作指南
2009-03-28 10:04 937转自:http://www.qqread.com/java/2 ... -
不同Web主机上的Servlet之间数据对象的相互传输
2009-03-03 10:48 1243由于数据库服务器A和服务库服务器B之间存在着数据的交换,而WE ... -
与常用支付平台接口
2009-03-03 10:10 1330step-by-step集成阿里巴巴支付宝接口 http:// ... -
Java 6 RowSet 使用完全剖析(2)
2009-03-02 19:19 1941分页 由于 CachedRowSet 是 ... -
Java 6 RowSet 使用完全剖析(1)
2009-03-02 18:52 1810javax.sql.rowset 自 JDK 1.4 引入,从 ... -
关于log4j配置文档详解
2009-02-25 14:39 761一.参数意义说明输出级别的种类ERROR、WARN、INFO、 ... -
Log4j最简入门(很不错的Log4j入门)
2009-02-25 14:34 788<!--[if !supportLists]--> ... -
Java对象的序列化和反序列化实践
2008-12-29 14:38 871引:当两个进程在进行远 ... -
Java语言中的参数传递详解
2008-12-24 08:41 794和其它程序设计语言类 ... -
set map table list总结
2008-10-13 11:39 1374<转自>http://bluefishyong. ... -
多态的运用 实现java 数据类型判断
2008-09-03 12:54 2387package javaBasic;/** *//** * 用 ... -
java关于23种java关于23种设计模式的有趣见解 设计模式的有趣见解
2008-09-03 12:48 1280创建型模式 1、FACTORY— ...
相关推荐
Java 6 RowSet 使用完全剖析
本文内容包括:RowSet简介类继承结构实验环境使用CachedRowSet使用WebRowSet使用FilteredRowSet使用JdbcRowSet使用JoinRowSet结束语下载参考资料C#提供了DataSet,可以将数据源中的数据读取到内存中,进行离线操作,...
jdk虽然定义了jdbc中的rowset接口但是没有实现。如果想使用rowset就要倒入这个包。
sun对Rowset的实现
支持CatchRowSet生成Excel报表
rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载
文档介绍了rowset的详细使用,并附有实例代码。
此处上传可以直接使用的rowset.jar包,直接下载放在包里,就可以使用了.
Java 6 RowSet 使用完全剖析 结合Spring2.0和ActiveMQ进行异步消息调用 struts+hibernate增删改查(一) AXIS 布署问题 struts+hibernate增删改查(二) MySQL中如何实现Top N及M至N段的记录查询?...
sun.jdbc.rowset的jar包,2000年的老包。不过有些老项目需要。 包括sun.jdbc.rowset.CachedRowSet。
sun公司的rowset jar包。操作数据库很酷的
网上找了很多 下载下来都是com.sun.rowset 这个是正确的sun.jdbc.rowset
java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....
JAVA开发人员必备!本文档是 Java Platform Standard Edition 6 的 API !Java 1.6 API的中文帮助文档。 深圳电信培训中心徐海蛟博士教学...org.omg.CORBA_2_3 CORBA_2_3 包定义对 Java[tm] Standard Edition 6 中现有...
在jdk1.5上用spring管理数据,部署到jdk1.4上,说CachedRowSet有问题,寻遍方法,最后得一rowset对jdk1.4里的进行覆盖,得的rowset.jar还需要进行修改,于是修改好,放到项目的lib中,成功!想到需要帮助的人们,...
目录 前言 第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 ... 17.3 使用Java XML API——Xerces和JDOM ...
6java异常处理 throw和throws、try和catch;自定义异常类;使用finally;使用异常的技巧和原则; 7 IO输入输出流 获取文件的基本信息;列出指定目录下的文件,并可过滤文件;创建文件和目录;删除文件和目录;移动...
javax.sql.RowSet select(java.lang.String sql, java.util.Map<java.lang.Integer,java.lang.Object> elements) 执行单条查询语句,适用于简单的sql查询语句 javax.sql.RowSet select(java.lang.String sql, ...
14 使用正则表达式验证电话号码的格式 第6章 Java异常处理 6. 1 throw. throws. try和catch 6. 2 自定义异常类 6. 3 使用finally 6. 4 使用异常的技巧与原则 第7章 IO——输入输出流 7...