A JoinRowSet
implementation lets you create a SQL JOIN
between RowSet
objects when they are not connected to a
data source. This is important because it saves the
overhead of having to create one or more connections.
The following topics are covered:
The JoinRowSet
interface is a
subinterface of the CachedRowSet
interface and thereby
inherits the capabilities of a CachedRowSet
object. This
means that a JoinRowSet
object is a disconnected RowSet
object and can operate without always being connected to a
data source.
A JoinRowSet
object serves as the holder of a SQL JOIN
.
The following line of code shows to create a
JoinRowSet
object:
JoinRowSet jrs = new JoinRowSetImpl();
The variable jrs
holds nothing until RowSet
objects are added to it.
Note: Alternatively, you can use the constructor from the JoinRowSet
implementation of your JDBC driver. However, implementations of the RowSet
interface will differ from the reference implementation. These implementations will have different names and constructors. For example, the Oracle JDBC driver's implementation of the JoinRowSet
interface is named oracle.jdbc.rowset.OracleJoinRowSet
.
Any RowSet
object can be added to a JoinRowSet
object as
long as it can be part of a SQL JOIN
. A JdbcRowSet
object,
which is always connected to its data source, can be added,
but typically it forms part of a JOIN
by operating with the
data source directly instead of becoming part of a JOIN
by
being added to a JoinRowSet
object. The point of providing
a JoinRowSet
implementation is to make it possible for
disconnected RowSet
objects to become part of a JOIN
relationship.
The owner of The Coffee Break chain of coffee houses wants
to get a list of the coffees he buys from Acme, Inc. In
order to do this, the owner will have to get information from two
tables, COFFEES
and SUPPLIERS
. In the database world before
RowSet
technology, programmers would send
the following query to the database:
String query = "SELECT COFFEES.COF_NAME FROM COFFEES, SUPPLIERS " + "WHERE SUPPLIERS.SUP_NAME = Acme.Inc. and " + "SUPPLIERS.SUP_ID = COFFEES.SUP_ID";
In the world of RowSet
technology, you can accomplish the
same result without having to send a query to the data
source. You can add RowSet
objects containing the data in
the two tables to a JoinRowSet
object. Then, because all
the pertinent data is in the JoinRowSet
object, you can
perform a query on it to get the desired data.
The following code fragment from JoinSample.testJoinRowSet
creates two CachedRowSet
objects, coffees
populated with the data from the
table COFFEES
, and suppliers
populated with the data
from the table SUPPLIERS
. The coffees
and suppliers
objects have to
make a connection to the database to execute their commands
and get populated with data, but after that is done, they do
not have to reconnect again in order to form a 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();
Looking at the SUPPLIERS
table, you can see that Acme, Inc.
has an identification number of 101. The coffees in the
table COFFEES
with the supplier identification number of
101 are Colombian and Colombian_Decaf. The joining of
information from both tables is possible because the two
tables have the column SUP_ID in common
. In JDBC RowSet
technology, SUP_ID
, the column on which the JOIN
is based,
is called the match column.
Each RowSet
object added to a JoinRowSet
object must have a
match column, the column on which the JOIN
is based. There
are two ways to set the match column for a RowSet
object.
The first way is to pass the match column to the JoinRowSet
method addRowSet
, as shown in the following line of code:
jrs.addRowSet(coffees, 2);
This line of code adds the coffees
CachedRowSet
to the jrs
object and
sets the second column of coffees
(SUP_ID
) as the
match column. The line of code could also have used the
column name rather that the column number.
jrs.addRowSet(coffees, "SUP_ID");
At this point, jrs
has only coffees
in it.
The next RowSet
object added to jrs
will have to be
able to form a JOIN
with coffees
, which is true of
suppliers
because both tables have the column
SUP_ID. The following line of code adds suppliers
to
jrs
and sets the column SUP_ID as the match column.
jrs.addRowSet(suppliers, 1);
Now jrs
contains a JOIN
between coffees
and
suppliers
from which the owner can get the names of
the coffees supplied by Acme, Inc. Because the code
did not set the type of JOIN
, jrs
holds an inner
JOIN, which is the default. In other words, a row in
jrs
combines a row in coffees
and a row in
suppliers
. It holds the columns in coffees
plus the columns in suppliers
for rows in which the
value in the COFFEES.SUP_ID
column matches the value in
SUPPLIERS.SUP_ID
. The following code prints out the names
of coffees supplied by Acme, Inc., where the String
supplierName
is equal to Acme, Inc.
Note that this is
possible because the column SUP_NAME
, which is from
suppliers
, and COF_NAME
, which is from
coffees
, are now both included in the JoinRowSet
object 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); } }
This will produce output similar to the following:
Coffees bought from Acme, Inc.: Colombian Colombian_Decaf
The JoinRowSet
interface provides constants for setting the
type of JOIN
that will be formed, but currently the only
type that is implemented is JoinRowSet.INNER_JOIN
.