文档

Java™教程
隐藏目录
使用JoinRowSet对象
路径: JDBC数据库访问
教程: JDBC基础知识

使用JoinRowSet对象

JoinRowSet实现允许您在RowSet对象未连接到数据源时创建SQLJOIN。这很重要,因为它节省了创建一个或多个连接的开销。

以下主题将被讨论:

JoinRowSet接口是CachedRowSet接口的子接口,因此继承了CachedRowSet对象的功能。这意味着JoinRowSet对象是一个断开连接的RowSet对象,可以在不始终连接到数据源的情况下操作。

创建JoinRowSet对象

JoinRowSet对象用作SQLJOIN的容器。以下来自JoinSample.java的示例显示了如何创建JoinRowSet对象:

    RowSetFactory factory = RowSetProvider.newFactory();  
    try (CachedRowSet coffees = factory.createCachedRowSet();
         CachedRowSet suppliers = factory.createCachedRowSet();
         JoinRowSet jrs = factory.createJoinRowSet()) {
      coffees.setCommand("SELECT * FROM COFFEES");
      // 为CachedRowSet coffees设置连接参数
      coffees.execute();
      
      suppliers.setCommand("SELECT * FROM SUPPLIERS");
      // 为CachedRowSet suppliers设置连接参数
      suppliers.execute();      

      jrs.addRowSet(coffees, "SUP_ID");
      jrs.addRowSet(suppliers, "SUP_ID");

      // ...

变量jrs在添加RowSet对象之前不包含任何内容。

添加RowSet对象

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

The 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

    try (CachedRowSet coffees = factory.createCachedRowSet();
         CachedRowSet suppliers = factory.createCachedRowSet();
         JoinRowSet jrs = factory.createJoinRowSet()) {
      coffees.setCommand("SELECT * FROM COFFEES");
      coffees.setUsername(settings.userName);
      coffees.setPassword(settings.password);
      coffees.setUrl(settings.urlString);
      coffees.execute();
      
      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 的咖啡是哥伦比亚和哥伦比亚脱咖啡因咖啡。两个表的信息可以通过它们共有的列 SUP_ID 进行连接。在 JDBC RowSet 技术中,基于 JOIN 的列 SUP_ID 被称为 匹配列

添加到 JoinRowSet 对象的每个 RowSet 对象必须有一个匹配列,即基于该列进行 JOIN。有两种方法可以为 RowSet 对象设置匹配列。第一种方法是将匹配列传递给 JoinRowSetaddRowSet 方法,如下面的代码所示:

jrs.addRowSet(coffees, "SUP_ID");

这行代码将coffees CachedRowSet添加到jrs对象中,并将coffeesSUP_ID列设置为匹配列。

此时,jrs中只有coffees。下一个添加到jrs中的RowSet对象必须能够与coffees进行JOIN,对于suppliers来说是成立的,因为两个表都有SUP_ID列。以下行代码将suppliers添加到jrs中,并将SUP_ID列设置为匹配列。

jrs.addRowSet(suppliers, "SUP_ID");

现在,jrs包含了coffeessuppliers之间的JOIN,从中所有者可以获取由Acme, Inc.供应的咖啡的名称。因为代码没有设置JOIN的类型,所以jrs持有内连接(inner JOIN),这是默认的。换句话说,jrs中的一行将coffees中的一行和suppliers中的一行组合在一起。它包含coffees中的列以及与COFFEES.SUP_ID列的值匹配SUPPLIERS.SUP_IDsuppliers中的列。以下代码打印出由Acme, Inc.供应的咖啡的名称,其中String类型的supplierName等于Acme, Inc.请注意,这是可能的,因为suppliersSUP_NAME列和coffeesCOF_NAME列现在都包含在JoinRowSet对象jrs中。

      System.out.println("从" + supplierName + "购买的咖啡:");
      while (jrs.next()) {
        if (jrs.getString("SUP_NAME").equals(supplierName)) { 
          String coffeeName = jrs.getString(1);
          System.out.println("     " + coffeeName);
        }
      }

这将产生类似以下的输出:

从Acme, Inc.购买的咖啡:
     Colombian
     Colombian_Decaf

JoinRowSet接口提供了用于设置将要形成的JOIN类型的常量,但目前只实现了JoinRowSet.INNER_JOIN


上一页: 使用CachedRowSetObjects
下一页: 使用FilteredRowSet Objects