使用 JoinRowSet 对象

JoinRowSet实现可让您在RowSet对象未连接到数据源时在它们之间创建 SQL JOIN。这很重要,因为它节省了必须创建一个或多个连接的开销。

涵盖以下主题:

JoinRowSetinterface是CachedRowSetinterface的子interface,因此继承了CachedRowSet对象的功能。这意味着JoinRowSet对象是断开连接的RowSet对象,并且可以在不始终连接到数据源的情况下运行。

创建 JoinRowSet 对象

JoinRowSet对象充当 SQL JOIN的持有人。以下代码行显示了如何创建JoinRowSet对象:

JoinRowSet jrs = new JoinRowSetImpl();

在将RowSet个对象添加到变量jrs之前,变量jrs不保存任何内容。

注意 :或者,您可以使用 JDBC 驱动程序的JoinRowSet实现中的构造函数。但是,RowSetinterface的实现将与参考实现不同。这些实现将具有不同的名称和构造函数。例如,JoinRowSetinterface的 Oracle JDBC 驱动程序实现称为oracle.jdbc.rowset.OracleJoinRowSet

添加行集对象

任何RowSet对象都可以添加到JoinRowSet对象中,只要它可以是 SQL JOIN的一部分即可。可以添加始终连接到其数据源的JdbcRowSet对象,但是通常它通过直接与数据源一起操作而成为JOIN的一部分,而不是通过添加到JoinRowSet对象而成为JOIN的一部分。提供JoinRowSet实现的 Object 是使断开连接的RowSet对象成为JOIN关系的一部分成为可能。

咖啡馆的 Coffee Break 连锁店的所有者想要获得他从 Acme,Inc.购买的咖啡的清单。为此,所有者必须从两个表COFFEESSUPPLIERS中获取信息。在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的数据填充。 coffeessuppliers对象必须构建与数据库的连接才能执行其命令并填充数据,但是这样做之后,它们不必再次重新连接即可形成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包含coffeessuppliers之间的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和来自coffeesCOF_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

JoinRowSetinterface提供用于设置将要形成的JOIN的类型的常量,但是当前唯一实现的类型是JoinRowSet.INNER_JOIN