使用 JoinRowSet 对象
JoinRowSet
实现可让您在RowSet
对象未连接到数据源时在它们之间创建 SQL JOIN
。这很重要,因为它节省了必须创建一个或多个连接的开销。
涵盖以下主题:
JoinRowSet
interface是CachedRowSet
interface的子interface,因此继承了CachedRowSet
对象的功能。这意味着JoinRowSet
对象是断开连接的RowSet
对象,并且可以在不始终连接到数据源的情况下运行。
创建 JoinRowSet 对象
JoinRowSet
对象充当 SQL JOIN
的持有人。以下代码行显示了如何创建JoinRowSet
对象:
JoinRowSet jrs = new JoinRowSetImpl();
在将RowSet
个对象添加到变量jrs
之前,变量jrs
不保存任何内容。
注意 :或者,您可以使用 JDBC 驱动程序的JoinRowSet
实现中的构造函数。但是,RowSet
interface的实现将与参考实现不同。这些实现将具有不同的名称和构造函数。例如,JoinRowSet
interface的 Oracle JDBC 驱动程序实现称为oracle.jdbc.rowset.OracleJoinRowSet
。
添加行集对象
任何RowSet
对象都可以添加到JoinRowSet
对象中,只要它可以是 SQL JOIN
的一部分即可。可以添加始终连接到其数据源的JdbcRowSet
对象,但是通常它通过直接与数据源一起操作而成为JOIN
的一部分,而不是通过添加到JoinRowSet
对象而成为JOIN
的一部分。提供JoinRowSet
实现的 Object 是使断开连接的RowSet
对象成为JOIN
关系的一部分成为可能。
咖啡馆的 Coffee Break 连锁店的所有者想要获得他从 Acme,Inc.购买的咖啡的清单。为此,所有者必须从两个表COFFEES
和SUPPLIERS
中获取信息。在RowSet
技术之前的数据库世界中,程序员将向数据库发送以下查询:
String query =
"SELECT COFFEES.COF_NAME " +
"FROM COFFEES, SUPPLIERS " +
"WHERE SUPPLIERS.SUP_NAME = Acme.Inc. " +
"and " +
"SUPPLIERS.SUP_ID = COFFEES.SUP_ID";
在RowSet
技术的世界中,您无需发送查询到数据源就可以实现相同的结果。您可以将包含两个表中数据的RowSet
对象添加到JoinRowSet
对象。然后,由于所有相关数据都在JoinRowSet
对象中,因此您可以对其进行查询以获得所需的数据。
以下来自JoinSample.testJoinRowSet的代码片段创建了两个CachedRowSet
对象,coffees
用表COFFEES
的数据填充,suppliers
用表SUPPLIERS
的数据填充。 coffees
和suppliers
对象必须构建与数据库的连接才能执行其命令并填充数据,但是这样做之后,它们不必再次重新连接即可形成JOIN
。
coffees = new CachedRowSetImpl();
coffees.setCommand("SELECT * FROM COFFEES");
coffees.setUsername(settings.userName);
coffees.setPassword(settings.password);
coffees.setUrl(settings.urlString);
coffees.execute();
suppliers = new CachedRowSetImpl();
suppliers.setCommand("SELECT * FROM SUPPLIERS");
suppliers.setUsername(settings.userName);
suppliers.setPassword(settings.password);
suppliers.setUrl(settings.urlString);
suppliers.execute();
管理 匹配列
查看SUPPLIERS
表,您可以看到 Acme,Inc.的标识号为 101.表COFFEES
中供应商标识号为 101 的咖啡是哥伦比亚咖啡和 Colombian_Decaf。由于两个表都有列SUP_ID in common
,因此可以合并来自两个表的信息。在 JDBC RowSet
技术中,JOIN
所基于的列SUP_ID
被称为匹配列。
添加到JoinRowSet
对象的每个RowSet
对象都必须具有匹配列,即JOIN
所基于的列。设置RowSet
对象的匹配列有两种方法。第一种方法是将 match 列传递给JoinRowSet
方法addRowSet
,如以下代码行所示:
jrs.addRowSet(coffees, 2);
此行代码将coffees
CachedRowSet
添加到jrs
对象,并将coffees
(SUP_ID
)的第二列设置为匹配列。该行代码也可以使用列名而不是列号。
jrs.addRowSet(coffees, "SUP_ID");
此时,jrs
中只有coffees
。添加到jrs
的下一个RowSet
对象将必须能够与coffees
形成JOIN
,这对suppliers
是正确的,因为两个表都具有列 SUP_ID。下面的代码行将suppliers
添加到jrs
并将列 SUP_ID 设置为匹配列。
jrs.addRowSet(suppliers, 1);
现在jrs
包含coffees
和suppliers
之间的JOIN
,所有者可以从中获取 Acme,Inc 提供的咖啡的名称。由于代码未设置JOIN
的类型,因此jrs
保留了内部 JOIN,这是默认设置。换句话说,jrs
中的行将coffees
中的行和suppliers
中的行组合在一起。对于COFFEES.SUP_ID
列中的值与SUPPLIERS.SUP_ID
中的值匹配的行,它将保留coffees
中的列以及suppliers
中的列。下面的代码打印出 Acme,Inc.提供的咖啡的名称,其中String
supplierName
等于Acme, Inc.
请注意,这是可能的,因为来自suppliers
的列SUP_NAME
和来自coffees
的COF_NAME
都已包含在JoinRowSet
对象jrs
中。
System.out.println("Coffees bought from " + supplierName + ": ");
while (jrs.next()) {
if (jrs.getString("SUP_NAME").equals(supplierName)) {
String coffeeName = jrs.getString(1);
System.out.println(" " + coffeeName);
}
}
这将产生类似于以下内容的输出:
Coffees bought from Acme, Inc.:
Colombian
Colombian_Decaf
JoinRowSet
interface提供用于设置将要形成的JOIN
的类型的常量,但是当前唯一实现的类型是JoinRowSet.INNER_JOIN
。