`
hjy2099
  • 浏览: 255553 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

Java 6 RowSet 使用完全剖析(3)

    博客分类:
  • JAVA
阅读更多

清单 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

分享到:
评论

相关推荐

    Java 6 RowSet 使用完全剖析

    Java 6 RowSet 使用完全剖析

    Java6RowSet使用完全剖析

    本文内容包括:RowSet简介类继承结构实验环境使用CachedRowSet使用WebRowSet使用FilteredRowSet使用JdbcRowSet使用JoinRowSet结束语下载参考资料C#提供了DataSet,可以将数据源中的数据读取到内存中,进行离线操作,...

    java的rowset工具包

    jdk虽然定义了jdbc中的rowset接口但是没有实现。如果想使用rowset就要倒入这个包。

    rowset

    sun对Rowset的实现

    rowset.jar

    支持CatchRowSet生成Excel报表

    rowset.jar下载

    rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载rowset.jar下载

    ROWSET介绍加实例

    文档介绍了rowset的详细使用,并附有实例代码。

    rowset.jar包

    此处上传可以直接使用的rowset.jar包,直接下载放在包里,就可以使用了.

    java文集

    Java 6 RowSet 使用完全剖析 结合Spring2.0和ActiveMQ进行异步消息调用 struts+hibernate增删改查(一) AXIS 布署问题 struts+hibernate增删改查(二) MySQL中如何实现Top N及M至N段的记录查询?...

    sun.jdbc.rowset的jar包

    sun.jdbc.rowset的jar包,2000年的老包。不过有些老项目需要。 包括sun.jdbc.rowset.CachedRowSet。

    com.sun.rowset.jar.zip

    sun公司的rowset jar包。操作数据库很酷的

    sun.jdbc.rowset

    网上找了很多 下载下来都是com.sun.rowset 这个是正确的sun.jdbc.rowset

    JAVA_API1.6文档(中文)

    java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....

    Java 1.6 API 中文 New

    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.4中无需修改的rowset.jar

    在jdk1.5上用spring管理数据,部署到jdk1.4上,说CachedRowSet有问题,寻遍方法,最后得一rowset对jdk1.4里的进行覆盖,得的rowset.jar还需要进行修改,于是修改好,放到项目的lib中,成功!想到需要帮助的人们,...

    Java数据库编程宝典3

    目录 前言 第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 ... 17.3 使用Java XML API——Xerces和JDOM ...

    java jdk实列宝典 光盘源代码

    6java异常处理 throw和throws、try和catch;自定义异常类;使用finally;使用异常的技巧和原则; 7 IO输入输出流 获取文件的基本信息;列出指定目录下的文件,并可过滤文件;创建文件和目录;删除文件和目录;移动...

    jdbc 帮助类 java 自带连接池 v1.01

    javax.sql.RowSet select(java.lang.String sql, java.util.Map&lt;java.lang.Integer,java.lang.Object&gt; elements) 执行单条查询语句,适用于简单的sql查询语句 javax.sql.RowSet select(java.lang.String sql, ...

    Java JDK实例宝典

    14 使用正则表达式验证电话号码的格式 第6章 Java异常处理 6. 1 throw. throws. try和catch 6. 2 自定义异常类 6. 3 使用finally 6. 4 使用异常的技巧与原则 第7章 IO——输入输出流 7...

Global site tag (gtag.js) - Google Analytics