`
hjy2099
  • 浏览: 262697 次
  • 性别: 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 使用完全剖析

    java文集

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

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    必须要时从Java SE API的源代码分析,了解各种语法在Java SE API中如何应用。  《Java JDK 7学习笔记》将IDE操作纳为教学内容之一,使读者能与实践结合,提供的视频教学能更清楚地帮助读者掌握操作步骤。 内容简介 ...

    Java语言基础下载

    Java技术概述 3 Java技术的优点 3 Java虚拟机 4 类加载器 6 Windows环境变量 8 内容总结 13 独立实践 14 第二章: 面向对象概述 15 学习目标 15 面向对象(Object Oriented) 16 面向对象的主要特性 18 抽象...

    Java数据编程指南

    面向对象的分析与设计 OOA、OOD与OOP 面向对象的分析 面向对象的设计 小结 第3章 用UML进行对象建模 为什么使用UML 什么是UML UML图表 如何将UML建模图表配合在一起 如何将UML合并到...

    java学习路线图 java学习路线图

    - **内存分析**:学习Java内存模型,理解栈、堆以及垃圾回收机制。 - **递归**:学习如何编写和理解递归函数。 - **集合类**:熟悉ArrayList、LinkedList、HashSet、HashMap等数据结构的使用。 - **泛型**:学习...

    Excel与Java的传输工具poi-3.17

    12. **接口与实现**:如RowSet接口,它的实现类如Java POI的 JRSSerializableRowSet 和 JdbcRowSetImpl,可将Excel数据作为JDBC结果集处理。 使用Apache POI时,开发人员需要了解这些基本概念,并根据实际需求选择...

    java自学路线图java自学路线图.doc

    深入理解内存分析、递归以及集合类(如ArrayList、LinkedList和HashMap)的使用。泛型提供类型安全,自动打包与解包简化了数据类型的转换。Annotation用于元数据,IO流处理文件操作,多线程和线程同步(如...

    Java反序列化实战.pdf

    - **PoC示例**:通过构造特定的JSON数据格式(如使用`com.sun.rowset.JdbcRowSetImpl`类)可以触发远程代码执行漏洞。 - **修复措施**:添加黑名单机制,禁止加载敏感类。 - **Weblogic安全漏洞**: - **CVE-...

    JDBC培训资料java连接数据库

    3. **OOAD(面向对象分析与设计)和数据库设计**: 在进行JDBC开发前,通常需要先进行OOAD,理解业务需求,设计实体类和关系,然后根据设计创建数据库表结构。这有助于构建出符合业务逻辑的数据模型。 4. **JDBC...

    java自学之路num1

    深入理解内存分析,了解递归操作,掌握集合类(如ArrayList、LinkedList、HashMap等),泛型的使用,自动装箱拆箱原理,以及Annotation(注解)的使用。此外,还需要学习多线程编程,包括线程的创建、同步...

    java学习之路

    在Java中,通过`java.util.regex`包来实现正则表达式的使用。 - 常见的正则表达式操作包括`Pattern`和`Matcher`类,用于编译和匹配正则表达式。 #### 反射机制 - Java的反射机制允许运行时获取类的信息并创建对象。...

    jdk1.4,jdk1.5,jdk6

    本文将深入探讨JDK 1.4、JDK 1.5(也称为Java 5)和JDK 6这三个重要版本的关键特性。 **JDK 1.4** JDK 1.4是Java发展历程中的一个里程碑,发布于2002年。这个版本引入了许多关键的新特性,包括: 1. **异常链**:...

    marshalsec.pdf

    - 在可能的情况下,限制或完全避免使用反序列化功能,特别是对于不受信任的数据。 - 使用更安全的数据交换格式替代Java对象序列化。 - 采用自动化工具和库来帮助识别和修复潜在的安全漏洞。 整体而言,本文档深入...

    oracle数据库连接包

    - ojdbc是Oracle提供的JDBC驱动,例如ojdbc8.jar,它是Type 4驱动,完全用Java编写,无需安装Oracle客户端。 - 配置数据源:在Java应用中,可以配置DataSource对象,提供更高级的连接池管理,提高性能和资源利用率...

    数据库数据导出excel表格

    对于大数据量,可以考虑使用迭代器模式(`RowSet`)减少内存消耗,或者分批写入数据到Excel,避免一次性加载所有数据。 总结,通过以上步骤,我们可以使用Java和Apache POI实现从数据库导出数据到Excel的功能。这...

Global site tag (gtag.js) - Google Analytics