Decorates a ResultSet with checks for a SQL NULL value on each getXXX method. : ResultSet « Database SQL JDBC « Java






Decorates a ResultSet with checks for a SQL NULL value on each getXXX method.

 

import java.io.InputStream;
import java.io.Reader;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;

/**
 * Decorates a <code>ResultSet</code> with checks for a SQL NULL value on each
 * <code>getXXX</code> method. If a column value obtained by a
 * <code>getXXX</code> method is not SQL NULL, the column value is returned.
 * If the column value is SQL null, an alternate value is returned. The
 * alternate value defaults to the Java <code>null</code> value, which can be
 * overridden for instances of the class.
 * 
 * <p>
 * Usage example: <blockquote>
 * 
 * <pre>
 *  Connection conn = // somehow get a connection
 *  Statement stmt = conn.createStatement();
 *  ResultSet rs = stmt.executeQuery(&quot;SELECT col1, col2 FROM table1&quot;);
 *  
 *  // Wrap the result set for SQL NULL checking
 *  SqlNullCheckedResultSet wrapper = new SqlNullCheckedResultSet(rs);
 *  wrapper.setNullString(&quot;---N/A---&quot;); // Set null string
 *  wrapper.setNullInt(-999); // Set null integer
 *  rs = ProxyFactory.instance().createResultSet(wrapper);
 *  
 *  while (rs.next()) {
 *      // If col1 is SQL NULL, value returned will be &quot;---N/A---&quot;
 *      String col1 = rs.getString(&quot;col1&quot;);
 *      // If col2 is SQL NULL, value returned will be -999
 *      int col2 = rs.getInt(&quot;col2&quot;);
 *  }
 *  rs.close();
 * </pre>
 * 
 * </blockquote>
 * </p>
 * <p>
 * Unlike some other classes in DbUtils, this class is NOT thread-safe.
 * </p>
 */
public class SqlNullCheckedResultSet implements InvocationHandler {

  /**
   * Maps normal method names (ie. "getBigDecimal") to the corresponding null
   * Method object (ie. getNullBigDecimal).
   */
  private static final Map nullMethods = new HashMap();

  static {
    Method[] methods = SqlNullCheckedResultSet.class.getMethods();
    for (int i = 0; i < methods.length; i++) {
      String methodName = methods[i].getName();

      if (methodName.startsWith("getNull")) {
        String normalName = "get" + methodName.substring(7);
        nullMethods.put(normalName, methods[i]);
      }
    }
  }

  private InputStream nullAsciiStream = null;

  private BigDecimal nullBigDecimal = null;

  private InputStream nullBinaryStream = null;

  private Blob nullBlob = null;

  private boolean nullBoolean = false;

  private byte nullByte = 0;

  private byte[] nullBytes = null;

  private Reader nullCharacterStream = null;

  private Clob nullClob = null;

  private Date nullDate = null;

  private double nullDouble = 0.0;

  private float nullFloat = 0.0f;

  private int nullInt = 0;

  private long nullLong = 0;

  private Object nullObject = null;

  private Ref nullRef = null;

  private short nullShort = 0;

  private String nullString = null;

  private Time nullTime = null;

  private Timestamp nullTimestamp = null;

  private URL nullURL = null;

  /**
   * The wrapped result.
   */
  private final ResultSet rs;

  /**
   * Constructs a new instance of <code>SqlNullCheckedResultSet</code> to wrap
   * the specified <code>ResultSet</code>.
   * 
   * @param rs
   *          ResultSet to wrap
   */
  public SqlNullCheckedResultSet(ResultSet rs) {
    super();
    this.rs = rs;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getAsciiStream</code> method.
   * 
   * @return the value
   */
  public InputStream getNullAsciiStream() {
    return this.nullAsciiStream;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getBigDecimal</code> method.
   * 
   * @return the value
   */
  public BigDecimal getNullBigDecimal() {
    return this.nullBigDecimal;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getBinaryStream</code> method.
   * 
   * @return the value
   */
  public InputStream getNullBinaryStream() {
    return this.nullBinaryStream;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getBlob</code> method.
   * 
   * @return the value
   */
  public Blob getNullBlob() {
    return this.nullBlob;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getBoolean</code> method.
   * 
   * @return the value
   */
  public boolean getNullBoolean() {
    return this.nullBoolean;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getByte</code> method.
   * 
   * @return the value
   */
  public byte getNullByte() {
    return this.nullByte;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getBytes</code> method.
   * 
   * @return the value
   */
  public byte[] getNullBytes() {
    return this.nullBytes;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getCharacterStream</code> method.
   * 
   * @return the value
   */
  public Reader getNullCharacterStream() {
    return this.nullCharacterStream;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getClob</code> method.
   * 
   * @return the value
   */
  public Clob getNullClob() {
    return this.nullClob;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getDate</code> method.
   * 
   * @return the value
   */
  public Date getNullDate() {
    return this.nullDate;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getDouble</code> method.
   * 
   * @return the value
   */
  public double getNullDouble() {
    return this.nullDouble;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getFloat</code> method.
   * 
   * @return the value
   */
  public float getNullFloat() {
    return this.nullFloat;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getInt</code> method.
   * 
   * @return the value
   */
  public int getNullInt() {
    return this.nullInt;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getLong</code> method.
   * 
   * @return the value
   */
  public long getNullLong() {
    return this.nullLong;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getObject</code> method.
   * 
   * @return the value
   */
  public Object getNullObject() {
    return this.nullObject;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getRef</code> method.
   * 
   * @return the value
   */
  public Ref getNullRef() {
    return this.nullRef;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getShort</code> method.
   * 
   * @return the value
   */
  public short getNullShort() {
    return this.nullShort;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getString</code> method.
   * 
   * @return the value
   */
  public String getNullString() {
    return this.nullString;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getTime</code> method.
   * 
   * @return the value
   */
  public Time getNullTime() {
    return this.nullTime;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getTimestamp</code> method.
   * 
   * @return the value
   */
  public Timestamp getNullTimestamp() {
    return this.nullTimestamp;
  }

  /**
   * Returns the value when a SQL null is encountered as the result of invoking
   * a <code>getURL</code> method.
   * 
   * @return the value
   */
  public URL getNullURL() {
    return this.nullURL;
  }

  /**
   * Intercepts calls to <code>get*</code> methods and calls the appropriate
   * <code>getNull*</code> method if the <code>ResultSet</code> returned
   * <code>null</code>.
   * 
   * @throws Throwable
   * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object,
   *      java.lang.reflect.Method, java.lang.Object[])
   */
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    Object result = method.invoke(this.rs, args);

    Method nullMethod = (Method) nullMethods.get(method.getName());

    // Check nullMethod != null first so that we don't call wasNull()
    // before a true getter method was invoked on the ResultSet.
    return (nullMethod != null && this.rs.wasNull()) ? nullMethod.invoke(this, (Object[]) null)
        : result;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getAsciiStream</code> method.
   * 
   * @param nullAsciiStream
   *          the value
   */
  public void setNullAsciiStream(InputStream nullAsciiStream) {
    this.nullAsciiStream = nullAsciiStream;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getBigDecimal</code> method.
   * 
   * @param nullBigDecimal
   *          the value
   */
  public void setNullBigDecimal(BigDecimal nullBigDecimal) {
    this.nullBigDecimal = nullBigDecimal;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getBinaryStream</code> method.
   * 
   * @param nullBinaryStream
   *          the value
   */
  public void setNullBinaryStream(InputStream nullBinaryStream) {
    this.nullBinaryStream = nullBinaryStream;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getBlob</code> method.
   * 
   * @param nullBlob
   *          the value
   */
  public void setNullBlob(Blob nullBlob) {
    this.nullBlob = nullBlob;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getBoolean</code> method.
   * 
   * @param nullBoolean
   *          the value
   */
  public void setNullBoolean(boolean nullBoolean) {
    this.nullBoolean = nullBoolean;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getByte</code> method.
   * 
   * @param nullByte
   *          the value
   */
  public void setNullByte(byte nullByte) {
    this.nullByte = nullByte;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getBytes</code> method.
   * 
   * @param nullBytes
   *          the value
   */
  public void setNullBytes(byte[] nullBytes) {
    this.nullBytes = nullBytes;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getCharacterStream</code> method.
   * 
   * @param nullCharacterStream
   *          the value
   */
  public void setNullCharacterStream(Reader nullCharacterStream) {
    this.nullCharacterStream = nullCharacterStream;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getClob</code> method.
   * 
   * @param nullClob
   *          the value
   */
  public void setNullClob(Clob nullClob) {
    this.nullClob = nullClob;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getDate</code> method.
   * 
   * @param nullDate
   *          the value
   */
  public void setNullDate(Date nullDate) {
    this.nullDate = nullDate;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getDouble</code> method.
   * 
   * @param nullDouble
   *          the value
   */
  public void setNullDouble(double nullDouble) {
    this.nullDouble = nullDouble;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getFloat</code> method.
   * 
   * @param nullFloat
   *          the value
   */
  public void setNullFloat(float nullFloat) {
    this.nullFloat = nullFloat;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getInt</code> method.
   * 
   * @param nullInt
   *          the value
   */
  public void setNullInt(int nullInt) {
    this.nullInt = nullInt;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getLong</code> method.
   * 
   * @param nullLong
   *          the value
   */
  public void setNullLong(long nullLong) {
    this.nullLong = nullLong;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getObject</code> method.
   * 
   * @param nullObject
   *          the value
   */
  public void setNullObject(Object nullObject) {
    this.nullObject = nullObject;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getRef</code> method.
   * 
   * @param nullRef
   *          the value
   */
  public void setNullRef(Ref nullRef) {
    this.nullRef = nullRef;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getShort</code> method.
   * 
   * @param nullShort
   *          the value
   */
  public void setNullShort(short nullShort) {
    this.nullShort = nullShort;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getString</code> method.
   * 
   * @param nullString
   *          the value
   */
  public void setNullString(String nullString) {
    this.nullString = nullString;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getTime</code> method.
   * 
   * @param nullTime
   *          the value
   */
  public void setNullTime(Time nullTime) {
    this.nullTime = nullTime;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getTimestamp</code> method.
   * 
   * @param nullTimestamp
   *          the value
   */
  public void setNullTimestamp(Timestamp nullTimestamp) {
    this.nullTimestamp = nullTimestamp;
  }

  /**
   * Sets the value to return when a SQL null is encountered as the result of
   * invoking a <code>getURL</code> method.
   * 
   * @param nullURL
   *          the value
   */
  public void setNullURL(URL nullURL) {
    this.nullURL = nullURL;
  }

}

   
  








Related examples in the same category

1.ResultSet getter Methods
2.ResultSet Update Methods
3.Get Column Count In ResultSet
4.Get available ResultSet types
5.Get BLOB data from resultset
6.ResultSet Update
7.Results Decorator XML
8.Results Decorator Text
9.Results Decorator SQL
10.Print ResultSet in HTML
11.Demonstrate simple use of the CachedRowSet
12.Metadata for ResultSet
13.Scrollable ResultSet
14.Concurrency in ResultSet
15.SQL statement: ResultSet and ResultSetMetaData
16.Output data from table
17.Convert a ResultSet to XML
18.Retrieve a rowcount from a ResultSet
19.Wraps a ResultSet in an Iterator.
20.Wraps a ResultSet to trim strings returned by the getString() and getObject() methods.