|
Java example source code file (JoinRowSet.java)
This example Java source code file (JoinRowSet.java) is included in the alvinalexander.com
"Java Source Code
Warehouse" project. The intent of this project is to help you "Learn
Java by Example" TM.
Learn more about this Java project at its project page.
The JoinRowSet.java Java example source code
/*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package javax.sql.rowset;
import java.sql.*;
import javax.sql.*;
import javax.naming.*;
import java.io.*;
import java.math.*;
import java.util.*;
import javax.sql.rowset.*;
/**
* The <code>JoinRowSet interface provides a mechanism for combining related
* data from different <code>RowSet objects into one JoinRowSet
* object, which represents an SQL <code>JOIN.
* In other words, a <code>JoinRowSet object acts as a
* container for the data from <code>RowSet objects that form an SQL
* <code>JOIN relationship.
* <P>
* The <code>Joinable interface provides the methods for setting,
* retrieving, and unsetting a match column, the basis for
* establishing an SQL <code>JOIN relationship. The match column may
* alternatively be set by supplying it to the appropriate version of the
* <code>JointRowSet method addRowSet .
*
* <h3>1.0 Overview
* Disconnected <code>RowSet objects (CachedRowSet objects
* and implementations extending the <code>CachedRowSet interface)
* do not have a standard way to establish an SQL <code>JOIN between
* <code>RowSet objects without the expensive operation of
* reconnecting to the data source. The <code>JoinRowSet
* interface is specifically designed to address this need.
* <P>
* Any <code>RowSet object
* can be added to a <code>JoinRowSet object to become
* part of an SQL <code>JOIN relationship. This means that both connected
* and disconnected <code>RowSet objects can be part of a JOIN .
* <code>RowSet objects operating in a connected environment
* (<code>JdbcRowSet objects) are
* encouraged to use the database to which they are already
* connected to establish SQL <code>JOIN relationships between
* tables directly. However, it is possible for a
* <code>JdbcRowSet object to be added to a JoinRowSet object
* if necessary.
* <P>
* Any number of <code>RowSet objects can be added to an
* instance of <code>JoinRowSet provided that they
* can be related in an SQL <code>JOIN.
* By definition, the SQL <code>JOIN statement is used to
* combine the data contained in two or more relational database tables based
* upon a common attribute. The <code>Joinable interface provides the methods
* for establishing a common attribute, which is done by setting a
* <i>match column. The match column commonly coincides with
* the primary key, but there is
* no requirement that the match column be the same as the primary key.
* By establishing and then enforcing column matches,
* a <code>JoinRowSet object establishes JOIN relationships
* between <code>RowSet objects without the assistance of an available
* relational database.
* <P>
* The type of <code>JOIN to be established is determined by setting
* one of the <code>JoinRowSet constants using the method
* <code>setJoinType. The following SQL JOIN types can be set:
* <UL>
* <LI>CROSS_JOIN
* <LI>FULL_JOIN
* <LI>INNER_JOIN - the default if no JOIN type has been set
* <LI>LEFT_OUTER_JOIN
* <LI>RIGHT_OUTER_JOIN
* </UL>
* Note that if no type is set, the <code>JOIN will automatically be an
* inner join. The comments for the fields in the
* <code>JoinRowSet interface explain these JOIN types, which are
* standard SQL <code>JOIN types.
*
* <h3>2.0 Using a JoinRowSet Object for Creating a JOIN
* When a <code>JoinRowSet object is created, it is empty.
* The first <code>RowSet object to be added becomes the basis for the
* <code>JOIN relationship.
* Applications must determine which column in each of the
* <code>RowSet objects to be added to the JoinRowSet object
* should be the match column. All of the
* <code>RowSet objects must contain a match column, and the values in
* each match column must be ones that can be compared to values in the other match
* columns. The columns do not have to have the same name, though they often do,
* and they do not have to store the exact same data type as long as the data types
* can be compared.
* <P>
* A match column can be be set in two ways:
* <ul>
* <li>By calling the Joinable method setMatchColumn
* This is the only method that can set the match column before a <code>RowSet
* object is added to a <code>JoinRowSet object. The RowSet object
* must have implemented the <code>Joinable interface in order to use the method
* <code>setMatchColumn. Once the match column value
* has been set, this method can be used to reset the match column at any time.
* <li>By calling one of the versions of the JoinRowSet method
* <code>addRowSet that takes a column name or number (or an array of
* column names or numbers)<BR>
* Four of the five <code>addRowSet methods take a match column as a parameter.
* These four methods set or reset the match column at the time a <code>RowSet
* object is being added to a <code>JoinRowSet object.
* </ul>
* <h3>3.0 Sample Usage
* <p>
* The following code fragment adds two <code>CachedRowSet
* objects to a <code>JoinRowSet object. Note that in this example,
* no SQL <code>JOIN type is set, so the default JOIN type,
* which is <i>INNER_JOIN, is established.
* <p>
* In the following code fragment, the table <code>EMPLOYEES, whose match
* column is set to the first column (<code>EMP_ID), is added to the
* <code>JoinRowSet object jrs. Then
* the table <code>ESSP_BONUS_PLAN, whose match column is likewise
* the <code>EMP_ID column, is added. When this second
* table is added to <i>jrs, only the rows in
* <code>ESSP_BONUS_PLAN whose EMP_ID value matches an
* <code>EMP_ID value in the EMPLOYEES table are added.
* In this case, everyone in the bonus plan is an employee, so all of the rows
* in the table <code>ESSP_BONUS_PLAN are added to the JoinRowSet
* object. In this example, both <code>CachedRowSet objects being added
* have implemented the <code>Joinable interface and can therefore call
* the <code>Joinable method setMatchColumn .
* <PRE>
* JoinRowSet jrs = new JoinRowSetImpl();
*
* ResultSet rs1 = stmt.executeQuery("SELECT * FROM EMPLOYEES");
* CachedRowSet empl = new CachedRowSetImpl();
* empl.populate(rs1);
* empl.setMatchColumn(1);
* jrs.addRowSet(empl);
*
* ResultSet rs2 = stmt.executeQuery("SELECT * FROM ESSP_BONUS_PLAN");
* CachedRowSet bonus = new CachedRowSetImpl();
* bonus.populate(rs2);
* bonus.setMatchColumn(1); // EMP_ID is the first column
* jrs.addRowSet(bonus);
* </PRE>
* <P>
* At this point, <i>jrs is an inside JOIN of the two RowSet objects
* based on their <code>EMP_ID columns. The application can now browse the
* combined data as if it were browsing one single <code>RowSet object.
* Because <i>jrs is itself a RowSet object, an application can
* navigate or modify it using <code>RowSet methods.
* <PRE>
* jrs.first();
* int employeeID = jrs.getInt(1);
* String employeeName = jrs.getString(2);
* </PRE>
* <P>
* Note that because the SQL <code>JOIN must be enforced when an application
* adds a second or subsequent <code>RowSet object, there
* may be an initial degradation in performance while the <code>JOIN is
* being performed.
* <P>
* The following code fragment adds an additional <code>CachedRowSet object.
* In this case, the match column (<code>EMP_ID) is set when the
* <code>CachedRowSet object is added to the JoinRowSet object.
* <PRE>
* ResultSet rs3 = stmt.executeQuery("SELECT * FROM 401K_CONTRIB");
* CachedRowSet fourO1k = new CachedRowSetImpl();
* four01k.populate(rs3);
* jrs.addRowSet(four01k, 1);
* </PRE>
* <P>
* The <code>JoinRowSet object jrs now contains values from all three
* tables. The data in each row in <i>four01k in which the value for the
* <code>EMP_ID column matches a value for the EMP_ID column
* in <i>jrs has been added to jrs.
*
* <h3>4.0 JoinRowSet Methods
* The <code>JoinRowSet interface supplies several methods for adding
* <code>RowSet objects and for getting information about the
* <code>JoinRowSet object.
* <UL>
* <LI>Methods for adding one or more RowSet objects
* These methods allow an application to add one <code>RowSet object
* at a time or to add multiple <code>RowSet objects at one time. In
* either case, the methods may specify the match column for each
* <code>RowSet object being added.
* <LI>Methods for getting information
* One method retrieves the <code>RowSet objects in the
* <code>JoinRowSet object, and another method retrieves the
* <code>RowSet names. A third method retrieves either the SQL
* <code>WHERE clause used behind the scenes to form the
* <code>JOIN or a text description of what the WHERE
* clause does.
* <LI>Methods related to the type of JOIN
* One method sets the <code>JOIN type, and five methods find out whether
* the <code>JoinRowSet object supports a given type.
* <LI>A method to make a separate copy of the JoinRowSet object
* This method creates a copy that can be persisted to the data source.
* </UL>
*
*/
public interface JoinRowSet extends WebRowSet {
/**
* Adds the given <code>RowSet object to this JoinRowSet
* object. If the <code>RowSet object
* is the first to be added to this <code>JoinRowSet
* object, it forms the basis of the <code>JOIN relationship to be
* established.
* <P>
* This method should be used only when the given <code>RowSet
* object already has a match column that was set with the <code>Joinable
* method <code>setMatchColumn.
* <p>
* Note: A <code>Joinable object is any RowSet object
* that has implemented the <code>Joinable interface.
*
* @param rowset the <code>RowSet object that is to be added to this
* <code>JoinRowSet object; it must implement the
* <code>Joinable interface and have a match column set
* @throws SQLException if (1) an empty rowset is added to the to this
* <code>JoinRowSet object, (2) a match column has not been
* set for <i>rowset, or (3) rowset
* violates the active <code>JOIN
* @see Joinable#setMatchColumn
*/
public void addRowSet(Joinable rowset) throws SQLException;
/**
* Adds the given <code>RowSet object to this JoinRowSet
* object and sets the designated column as the match column for
* the <code>RowSet object. If the RowSet object
* is the first to be added to this <code>JoinRowSet
* object, it forms the basis of the <code>JOIN relationship to be
* established.
* <P>
* This method should be used when <i>RowSet does not already have a match
* column set.
*
* @param rowset the <code>RowSet object that is to be added to this
* <code>JoinRowSet object; it may implement the
* <code>Joinable interface
* @param columnIdx an <code>int that identifies the column to become the
* match column
* @throws SQLException if (1) <i>rowset is an empty rowset or
* (2) <i>rowset violates the active JOIN
* @see Joinable#unsetMatchColumn
*/
public void addRowSet(RowSet rowset, int columnIdx) throws SQLException;
/**
* Adds <i>rowset to this JoinRowSet object and
* sets the designated column as the match column. If <i>rowset
* is the first to be added to this <code>JoinRowSet
* object, it forms the basis for the <code>JOIN relationship to be
* established.
* <P>
* This method should be used when the given <code>RowSet object
* does not already have a match column.
*
* @param rowset the <code>RowSet object that is to be added to this
* <code>JoinRowSet object; it may implement the
* <code>Joinable interface
* @param columnName the <code>String object giving the name of the
* column to be set as the match column
* @throws SQLException if (1) <i>rowset is an empty rowset or
* (2) the match column for <i>rowset does not satisfy the
* conditions of the <code>JOIN
*/
public void addRowSet(RowSet rowset,
String columnName) throws SQLException;
/**
* Adds one or more <code>RowSet objects contained in the given
* array of <code>RowSet objects to this JoinRowSet
* object and sets the match column for
* each of the <code>RowSet objects to the match columns
* in the given array of column indexes. The first element in
* <i>columnIdx is set as the match column for the first
* <code>RowSet object in rowset, the second element of
* <i>columnIdx is set as the match column for the second element
* in <i>rowset, and so on.
* <P>
* The first <code>RowSet object added to this JoinRowSet
* object forms the basis for the <code>JOIN relationship.
* <P>
* This method should be used when the given <code>RowSet object
* does not already have a match column.
*
* @param rowset an array of one or more <code>RowSet objects
* to be added to the <code>JOIN; it may implement the
* <code>Joinable interface
* @param columnIdx an array of <code>int values indicating the index(es)
* of the columns to be set as the match columns for the <code>RowSet
* objects in <i>rowset
* @throws SQLException if (1) an empty rowset is added to this
* <code>JoinRowSet object, (2) a match column is not set
* for a <code>RowSet object in rowset, or (3)
* a <code>RowSet object being added violates the active
* <code>JOIN
*/
public void addRowSet(RowSet[] rowset,
int[] columnIdx) throws SQLException;
/**
* Adds one or more <code>RowSet objects contained in the given
* array of <code>RowSet objects to this JoinRowSet
* object and sets the match column for
* each of the <code>RowSet objects to the match columns
* in the given array of column names. The first element in
* <i>columnName is set as the match column for the first
* <code>RowSet object in rowset, the second element of
* <i>columnName is set as the match column for the second element
* in <i>rowset, and so on.
* <P>
* The first <code>RowSet object added to this JoinRowSet
* object forms the basis for the <code>JOIN relationship.
* <P>
* This method should be used when the given <code>RowSet object(s)
* does not already have a match column.
*
* @param rowset an array of one or more <code>RowSet objects
* to be added to the <code>JOIN; it may implement the
* <code>Joinable interface
* @param columnName an array of <code>String values indicating the
* names of the columns to be set as the match columns for the
* <code>RowSet objects in rowset
* @throws SQLException if (1) an empty rowset is added to this
* <code>JoinRowSet object, (2) a match column is not set
* for a <code>RowSet object in rowset, or (3)
* a <code>RowSet object being added violates the active
* <code>JOIN
*/
public void addRowSet(RowSet[] rowset,
String[] columnName) throws SQLException;
/**
* Returns a <code>Collection object containing the
* <code>RowSet objects that have been added to this
* <code>JoinRowSet object.
* This should return the 'n' number of RowSet contained
* within the <code>JOIN and maintain any updates that have occurred while in
* this union.
*
* @return a <code>Collection object consisting of the
* <code>RowSet objects added to this JoinRowSet
* object
* @throws SQLException if an error occurs generating the
* <code>Collection object to be returned
*/
public Collection<?> getRowSets() throws java.sql.SQLException;
/**
* Returns a <code>String array containing the names of the
* <code>RowSet objects added to this JoinRowSet
* object.
*
* @return a <code>String array of the names of the
* <code>RowSet objects in this JoinRowSet
* object
* @throws SQLException if an error occurs retrieving the names of
* the <code>RowSet objects
* @see CachedRowSet#setTableName
*/
public String[] getRowSetNames() throws java.sql.SQLException;
/**
* Creates a new <code>CachedRowSet object containing the
* data in this <code>JoinRowSet object, which can be saved
* to a data source using the <code>SyncProvider object for
* the <code>CachedRowSet object.
* <P>
* If any updates or modifications have been applied to the JoinRowSet
* the CachedRowSet returned by the method will not be able to persist
* it's changes back to the originating rows and tables in the
* in the datasource. The CachedRowSet instance returned should not
* contain modification data and it should clear all properties of
* it's originating SQL statement. An application should reset the
* SQL statement using the <code>RowSet.setCommand method.
* <p>
* In order to allow changes to be persisted back to the datasource
* to the originating tables, the <code>acceptChanges method
* should be used and called on a JoinRowSet object instance. Implementations
* can leverage the internal data and update tracking in their
* implementations to interact with the SyncProvider to persist any
* changes.
*
* @return a CachedRowSet containing the contents of the JoinRowSet
* @throws SQLException if an error occurs assembling the CachedRowSet
* object
* @see javax.sql.RowSet
* @see javax.sql.rowset.CachedRowSet
* @see javax.sql.rowset.spi.SyncProvider
*/
public CachedRowSet toCachedRowSet() throws java.sql.SQLException;
/**
* Indicates if CROSS_JOIN is supported by a JoinRowSet
* implementation
*
* @return true if the CROSS_JOIN is supported; false otherwise
*/
public boolean supportsCrossJoin();
/**
* Indicates if INNER_JOIN is supported by a JoinRowSet
* implementation
*
* @return true is the INNER_JOIN is supported; false otherwise
*/
public boolean supportsInnerJoin();
/**
* Indicates if LEFT_OUTER_JOIN is supported by a JoinRowSet
* implementation
*
* @return true is the LEFT_OUTER_JOIN is supported; false otherwise
*/
public boolean supportsLeftOuterJoin();
/**
* Indicates if RIGHT_OUTER_JOIN is supported by a JoinRowSet
* implementation
*
* @return true is the RIGHT_OUTER_JOIN is supported; false otherwise
*/
public boolean supportsRightOuterJoin();
/**
* Indicates if FULL_JOIN is supported by a JoinRowSet
* implementation
*
* @return true is the FULL_JOIN is supported; false otherwise
*/
public boolean supportsFullJoin();
/**
* Allow the application to adjust the type of <code>JOIN imposed
* on tables contained within the JoinRowSet object instance.
* Implementations should throw a SQLException if they do
* not support a given <code>JOIN type.
*
* @param joinType the standard JoinRowSet.XXX static field definition
* of a SQL <code>JOIN to re-configure a JoinRowSet instance on
* the fly.
* @throws SQLException if an unsupported <code>JOIN type is set
* @see #getJoinType
*/
public void setJoinType(int joinType) throws SQLException;
/**
* Return a SQL-like description of the WHERE clause being used
* in a JoinRowSet object. An implementation can describe
* the WHERE clause of the SQL <code>JOIN by supplying a SQL
* strings description of <code>JOIN or provide a textual
* description to assist applications using a <code>JoinRowSet
*
* @return whereClause a textual or SQL description of the logical
* WHERE clause used in the JoinRowSet instance
* @throws SQLException if an error occurs in generating a representation
* of the WHERE clause.
*/
public String getWhereClause() throws SQLException;
/**
* Returns a <code>int describing the set SQL JOIN type
* governing this JoinRowSet instance. The returned type will be one of
* standard JoinRowSet types: <code>CROSS_JOIN, INNER_JOIN ,
* <code>LEFT_OUTER_JOIN, RIGHT_OUTER_JOIN or
* <code>FULL_JOIN.
*
* @return joinType one of the standard JoinRowSet static field
* definitions of a SQL <code>JOIN. JoinRowSet.INNER_JOIN
* is returned as the default <code>JOIN type is no type has been
* explicitly set.
* @throws SQLException if an error occurs determining the SQL <code>JOIN
* type supported by the JoinRowSet instance.
* @see #setJoinType
*/
public int getJoinType() throws SQLException;
/**
* An ANSI-style <code>JOIN providing a cross product of two tables
*/
public static int CROSS_JOIN = 0;
/**
* An ANSI-style <code>JOIN providing a inner join between two tables. Any
* unmatched rows in either table of the join should be discarded.
*/
public static int INNER_JOIN = 1;
/**
* An ANSI-style <code>JOIN providing a left outer join between two
* tables. In SQL, this is described where all records should be
* returned from the left side of the JOIN statement.
*/
public static int LEFT_OUTER_JOIN = 2;
/**
* An ANSI-style <code>JOIN providing a right outer join between
* two tables. In SQL, this is described where all records from the
* table on the right side of the JOIN statement even if the table
* on the left has no matching record.
*/
public static int RIGHT_OUTER_JOIN = 3;
/**
* An ANSI-style <code>JOIN providing a a full JOIN. Specifies that all
* rows from either table be returned regardless of matching
* records on the other table.
*/
public static int FULL_JOIN = 4;
}
Other Java examples (source code examples)
Here is a short list of links related to this Java JoinRowSet.java source code file:
|