Issue Details (XML | Word | Printable)

Key: DBUTILS-20
Type: Improvement Improvement
Status: Closed Closed
Resolution: Fixed
Priority: Minor Minor
Assignee: Unassigned
Reporter: Corby Page
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Commons DbUtils

[dbutils] Implement Pluggable Adaptors to Make BeanHandler Smarter

Created: 26/Nov/03 08:21 AM   Updated: 02/Jan/08 07:29 AM
Return to search
Component/s: None
Affects Version/s: None
Fix Version/s: 1.1

Time Tracking:
Not Specified

File Attachments:
  Size
Text File diff.txt 2003-11-26 10:23 PM Corby Page 32 kB
Text File diff.txt 2003-11-26 08:23 AM Corby Page 20 kB
Environment:
Operating System: All
Platform: All

Bugzilla Id: 24997


 Description  « Hide
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/java/org/apache/commons/dbutils/BasicRowProcessor.java
src/java/org/apache/commons/dbutils/BasicRowProcessor.java
5c5
< *

> *
82c82
< *

> *
84c84
< *

> *
88a89
> * @author Corby Page
93,94c94,95
< * Set a bean's primitive properties to these defaults when SQL NULL
< * is returned. These are the same as the defaults that ResultSet get*

> * Set a bean's primitive properties to these defaults when SQL NULL
> * is returned. These are the same as the defaults that ResultSet get*
139c140
< * This implementation copies column values into the array in the same

> * This implementation copies column values into the array in the same
158,160c159,161
< * Convert a <code>ResultSet</code> row into a JavaBean. This
< * implementation uses reflection and <code>BeanInfo</code> classes to
< * match column names to bean property names. Properties are matched to

> * Convert a <code>ResultSet</code> row into a JavaBean. This
> * implementation uses reflection and <code>BeanInfo</code> classes to
> * match column names to bean property names. Properties are matched to
168c169
< *

> *
170c171
< * The property's set method parameter type matches the column

> * The property's set method parameter type matches the column
174c175
< *

> *
178c179
< * and booleans are set to false. Object bean properties are set to

> * and booleans are set to false. Object bean properties are set to
182,183c183,184
< *
< * @see org.apache.commons.dbutils.RowProcessor#toBean
(java.sql.ResultSet, java.lang.Class)

> *
> * @see org.apache.commons.dbutils.RowProcessor#toBean
(java.sql.ResultSet, java.lang.Class, org.apache.commons.dbutils.ColumnAdaptor)
185c186
< public Object toBean(ResultSet rs, Class type) throws SQLException {

> public Object toBean(ResultSet rs, Class type, ColumnAdaptor adaptor)
throws SQLException {
195c196
< return this.createBean(rs, type, props, columnToProperty, cols);

> return this.createBean(rs, type, props, columnToProperty, cols,
adaptor);
199,201c200,202
< * Convert a <code>ResultSet</code> into a <code>List</code> of
JavaBeans.
< * This implementation uses reflection and <code>BeanInfo</code> classes
to
< * match column names to bean property names. Properties are matched to

> * Convert a <code>ResultSet</code> into a <code>List</code> of JavaBeans.
> * This implementation uses reflection and <code>BeanInfo</code> classes
to
> * match column names to bean property names. Properties are matched to
209c210
< *

> *
211c212
< * The property's set method parameter type matches the column

> * The property's set method parameter type matches the column
215c216
< *

> *
219c220
< * and booleans are set to false. Object bean properties are set to

> * and booleans are set to false. Object bean properties are set to
223,224c224,225
< *
< * @see org.apache.commons.dbutils.RowProcessor#toBeanList
(java.sql.ResultSet, java.lang.Class)

> *
> * @see org.apache.commons.dbutils.RowProcessor#toBeanList
(java.sql.ResultSet, java.lang.Class, org.apache.commons.dbutils.ColumnAdaptor)
226c227
< public List toBeanList(ResultSet rs, Class type) throws SQLException {

> public List toBeanList(ResultSet rs, Class type, ColumnAdaptor adaptor)
throws SQLException {
239c240
< results.add(this.createBean(rs, type, props, columnToProperty,
cols));

> results.add(this.createBean(rs, type, props, columnToProperty,
cols, adaptor));
262c263,264
< int cols)

> int cols,
> ColumnAdaptor adaptor )
272,273d273
<
< Object value = rs.getObject;
277a278,279
> Object value = adaptor.getValue( rs, i, propType );
>
290c292
< * stored at each position represent the index in the PropertyDescriptor
[]

> * stored at each position represent the index in the PropertyDescriptor[]
293c295
< *

> *
296c298
< * @return An int[] with column index to property index mappings. The
0th

> * @return An int[] with column index to property index mappings. The 0th
298c300
< *

> *
327c329
< * Convert a <code>ResultSet</code> row into a <code>Map</code>. This

> * Convert a <code>ResultSet</code> row into a <code>Map</code>. This
329c331
< * names as keys. Calls to <code>map.get("COL")</code> and

> * names as keys. Calls to <code>map.get("COL")</code> and
367c369
< // Don't call setter if the value object isn't the right type

> // Don't call setter if the value object isn't the right type
392c394
< *

> *
481,482c483,484
< * lookups. This is needed for the toMap() implementation because
< * databases don't consistenly handle the casing of column names.

> * lookups. This is needed for the toMap() implementation because
> * databases don't consistenly handle the casing of column names.
520c522
< * @see java.util.Map#remove(java.lang.ObjecT)

> * @see java.util.Map#remove(java.lang.Object)
526c528
<

>
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/java/org/apache/commons/dbutils/ColumnAdaptor.java
src/java/org/apache/commons/dbutils/ColumnAdaptor.java
0a1,31
> package org.apache.commons.dbutils;
>
> import java.sql.SQLException;
> import java.sql.ResultSet;
>
> /**
> * Implementations of this interface adapt result-set columns to a bean
property
> *
> * @author Corby Page
> */
> public interface ColumnAdaptor
> { > /** > * Adapts the <code>ResultSet</code> column to a type that is compatible > * with the JavaBean property that the columns will be mapped to. > * > * @param rs the supplied ResultSet > * > * @param index the current column index of the ResultSet > * > * @param propType the datatype of the JavaBean property that we will be adapting > * the ResultSet column to. > * > * @return The resultSet column, adapted to a datatype that is intended > * to be compatible with the supplied property type. > * > * @throws java.sql.SQLException > */ > public Object getValue( ResultSet rs, int index, Class propType ) throws SQLException; > > }
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/java/org/apache/commons/dbutils/RowProcessor.java
src/java/org/apache/commons/dbutils/RowProcessor.java
95c95
< public Object toBean(ResultSet rs, Class type) throws SQLException;

> public Object toBean(ResultSet rs, Class type, ColumnAdaptor adaptor)
throws SQLException;
105c105
< public List toBeanList(ResultSet rs, Class type) throws SQLException;

> public List toBeanList(ResultSet rs, Class type, ColumnAdaptor adaptor)
throws SQLException;
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/java/org/apache/commons/dbutils/adaptors/DriverAdaptor.java
src/java/org/apache/commons/dbutils/adaptors/DriverAdaptor.java
0a1,63
> package org.apache.commons.dbutils.adaptors;
>
> import java.sql.ResultSet;
> import java.sql.SQLException;
>
> import org.apache.commons.dbutils.ColumnAdaptor;
>
> /**
> * <code>ColumnAdaptor</code> implementation that delegates to the JDBC
> * driver to perform the adaption. Will call type-specific method on the
driver
> * (such as getDouble, getInt, etc.) depending on the supplied datatype for
the
> * JavaBean property
> *
> * @see org.apache.commons.dbutils.ColumnAdaptor
> *
> * @author Corby Page
> */
> public class DriverAdaptor implements ColumnAdaptor {
>
> /**
> * The Singleton instance of this class.
> */
> private static final DriverAdaptor instance = new DriverAdaptor();
>
> /**
> * Returns the Singleton instance of this class.
> *
> * @return The single instance of this class.
> */
> public static DriverAdaptor instance() { > return instance; > }
>
> public Object getValue( ResultSet rs, int index, Class propType ) throws
SQLException {
> Object value;
> if ( propType.equals( Double.TYPE ) || propType.equals(
Double.class ) ) { > value = new Double( rs.getDouble( index ) ); > }
> else if ( propType.equals( Float.TYPE ) || propType.equals(
Float.class ) ) { > value = new Float( rs.getFloat( index ) ); > }
> else if ( propType.equals( Integer.TYPE ) || propType.equals(
Integer.class ) ) { > value = new Integer( rs.getInt( index ) ); > }
> else if ( propType.equals( Long.TYPE ) || propType.equals(
Long.class ) ) { > value = new Long( rs.getLong( index ) ); > }
> else if ( propType.equals( Short.TYPE ) || propType.equals(
Short.class ) ) { > value = new Short( rs.getShort( index ) ); > }
> else if ( propType.equals( Boolean.TYPE ) || propType.equals(
Boolean.class ) ) { > value = new Boolean( rs.getBoolean( index ) ); > }
> else if ( propType.equals( Byte.TYPE ) || propType.equals(
Byte.class ) ) { > value = new Byte( rs.getByte( index ) ); > }
> else { > value = rs.getObject( index ); > }
>
> return value;
> }
> }
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/java/org/apache/commons/dbutils/adaptors/SimpleAdaptor.java
src/java/org/apache/commons/dbutils/adaptors/SimpleAdaptor.java
0a1,36
> package org.apache.commons.dbutils.adaptors;
>
> import java.sql.ResultSet;
> import java.sql.SQLException;
>
> import org.apache.commons.dbutils.ColumnAdaptor;
>
> /**
> * <code>ColumnAdaptor</code> implementation that does no real work,
> * but performs quite well. Simply returns the result of a getObject() call on
> * the <code>ResultSet</code>
> *
> * @see org.apache.commons.dbutils.ColumnAdaptor
> *
> * @author Corby Page
> */
> public class SimpleAdaptor implements ColumnAdaptor
> {
> /**
> * The Singleton instance of this class.
> */
> private static final SimpleAdaptor instance = new SimpleAdaptor();
>
> /**
> * Returns the Singleton instance of this class.
> *
> * @return The single instance of this class.
> */
> public static SimpleAdaptor instance() {> return instance;> } }
>
> public Object getValue( ResultSet rs, int index, Class propType ) throws
SQLException { > return rs.getObject( index ); > }
> }
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/java/org/apache/commons/dbutils/handlers/BeanHandler.java
src/java/org/apache/commons/dbutils/handlers/BeanHandler.java
68a69,70
> import org.apache.commons.dbutils.ColumnAdaptor;
> import org.apache.commons.dbutils.adaptors.SimpleAdaptor;
77a80
> * @author Corby Page
92c95,101
< /**

> /**
> * The ColumnAdaptor implementation to use when adapting
> * columns to bean properties.
> */
> private ColumnAdaptor adaptor = SimpleAdaptor.instance();
>
> /**
115a125,140
> * Creates a new instance of BeanHandler.
> *
> * @param type The Class that objects returned from <code>handle()</code>
> * are created from.
> * @param convert The <code>RowProcessor</code> implementation
> * to use when converting rows into beans.
> * @param adaptor The <code>ColumnAdaptor</code> implementation to use
when adapting
> * columns to bean properties.
> */
> public BeanHandler(Class type, RowProcessor convert, ColumnAdaptor
adaptor ) { > this.type = type; > this.convert = convert; > this.adaptor = adaptor; > }
>
> /**
126c151
< return rs.next() ? this.convert.toBean(rs, this.type) : null;

> return rs.next() ? this.convert.toBean(rs, this.type, adaptor ) :
null;
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/java/org/apache/commons/dbutils/handlers/BeanListHandler.java
src/java/org/apache/commons/dbutils/handlers/BeanListHandler.java
69a70,71
> import org.apache.commons.dbutils.ColumnAdaptor;
> import org.apache.commons.dbutils.adaptors.SimpleAdaptor;
94c96,102
< /**

> /**
> * The ColumnAdaptor implementation to use when adapting
> * columns to bean properties.
> */
> private ColumnAdaptor adaptor = SimpleAdaptor.instance();
>
> /**
117a126,141
> * Creates a new instance of BeanListHandler.
> *
> * @param type The Class that objects returned from <code>handle()</code>
> * are created from.
> * @param convert The <code>RowProcessor</code> implementation
> * to use when converting rows into beans.
> * @param adaptor The <code>ColumnAdaptor</code> implementation to use
when adapting
> * columns to bean properties.
> */
> public BeanListHandler(Class type, RowProcessor convert, ColumnAdaptor
adaptor ) {> this.type = type;> this.convert = convert;> this.adaptor = adaptor;> } }
>
> /**
128c152
< return this.convert.toBeanList(rs, type);

> return this.convert.toBeanList(rs, type, adaptor );
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/test/org/apache/commons/dbutils/BaseTestCase.java
src/test/org/apache/commons/dbutils/BaseTestCase.java
63a64
> import java.math.BigDecimal;
67a69,73
> import org.apache.commons.dbutils.adaptors.DriverAdaptorTest;
> import org.apache.commons.dbutils.handlers.*;
> import org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSetTest;
> import org.apache.commons.dbutils.wrappers.StringTrimmedResultSetTest;
>
72,81d77
< import org.apache.commons.dbutils.handlers.ArrayHandlerTest;
< import org.apache.commons.dbutils.handlers.ArrayListHandlerTest;
< import org.apache.commons.dbutils.handlers.BeanHandlerTest;
< import org.apache.commons.dbutils.handlers.BeanListHandlerTest;
< import org.apache.commons.dbutils.handlers.MapHandlerTest;
< import org.apache.commons.dbutils.handlers.MapListHandlerTest;
< import org.apache.commons.dbutils.handlers.ScalarHandlerTest;
< import org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSetTest;
< import org.apache.commons.dbutils.wrappers.StringTrimmedResultSetTest;
<
100c96,97
< "notDate" };

> "notDate",
> "doubleTest"};
120c117,118
< new Date()};

> new Date(),
> new BigDecimal( 5 )};
132c130,131
< new Date()};

> new Date(),
> new BigDecimal( 6 )};
192a192
> suite.addTestSuite(DriverAdaptorTest.class);
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/test/org/apache/commons/dbutils/BasicRowProcessorTest.java
src/test/org/apache/commons/dbutils/BasicRowProcessorTest.java
67a68,69
> import org.apache.commons.dbutils.adaptors.SimpleAdaptor;
>
106c108
< b = (TestBean) processor.toBean(this.rs, TestBean.class);

> b = (TestBean) processor.toBean(this.rs, TestBean.class,
SimpleAdaptor.instance());
125c127
< List list = processor.toBeanList(this.rs, TestBean.class);

> List list = processor.toBeanList(this.rs, TestBean.class,
SimpleAdaptor.instance());
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/test/org/apache/commons/dbutils/MockResultSet.java
src/test/org/apache/commons/dbutils/MockResultSet.java
71a72
> import java.math.BigDecimal;
155c156,176
< } else if (methodName.equals("wasNull")) { --- > } else if (methodName.equals("getInt")) {
> Integer result = null;
> if ( args[0] instanceof Integer ) { > int col = ((Integer) args[0]).intValue(); > result = this.getInt(col); > > } else if (args[0] instanceof String) { > result = this.getInt((String) args[0]); > }
> return (result == null) ? new Integer( 0 ) : result;
> } else if (methodName.equals("getDouble")) {
> Double result = null;
> if ( args[0] instanceof Integer ) { > int col = ((Integer) args[0]).intValue(); > result = this.getDouble(col); > > } else if (args[0] instanceof String) { > result = this.getDouble((String) args[0]); > }
> return (result == null) ? new Double( 0 ) : result;
> } else if (methodName.equals("wasNull")) {
217a239,298
> /**
> * Gets the Double at the given column index.
> * @param columnIndex A 1 based index.
> * @throws SQLException
> */
> protected Integer getInt(int columnIndex) throws SQLException {
> Object obj = this.getObject(columnIndex);
> if ( obj == null ) { > return null; > }
> if ( obj instanceof Integer ) { > return (Integer)obj; > }
> throw new SQLException( "Column could not be mapped to integer
type" );
> }
>
> protected Integer getInt(String columnName) throws SQLException {
> Object obj = this.getObject(this.findColumnIndex(columnName));
> if ( obj == null ) {> return null;> } }
> if ( obj instanceof Integer ) { > return (Integer)obj; > }
> throw new SQLException( "Column could not be mapped to integer
type" );
> }
>
> /**
> * Gets the Double at the given column index.
> * @param columnIndex A 1 based index.
> * @throws SQLException
> */
> protected Double getDouble(int columnIndex) throws SQLException {
> Object obj = this.getObject(columnIndex);
> if ( obj == null ) { > return null; > }
> if ( obj instanceof Double ) { > return (Double)obj; > }
> if ( obj instanceof BigDecimal ) { > return new Double(((BigDecimal)obj).doubleValue()); > }
> throw new SQLException( "Column could not be mapped to double type" );
> }
>
> protected Double getDouble(String columnName) throws SQLException {
> Object obj = this.getObject(this.findColumnIndex(columnName));
> if ( obj == null ) {> return null;> } }
> if ( obj instanceof Double ) { > return (Double)obj; > }
> if ( obj instanceof BigDecimal ) { > return new Double(((BigDecimal)obj).doubleValue()); > }
> throw new SQLException( "Column could not be mapped to double type" );
> }
>
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/test/org/apache/commons/dbutils/TestBean.java
src/test/org/apache/commons/dbutils/TestBean.java
82a83,84
> private double doubleTest = 0;
>
180a183,189
> public double getDoubleTest() { > return doubleTest; > }
>
> public void setDoubleTest( double d ) { > doubleTest = d; > }
diff rN /cygdrive/c/Java/commons-dbutils
1.0/src/test/org/apache/commons/dbutils/adaptors/DriverAdaptorTest.java
src/test/org/apache/commons/dbutils/adaptors/DriverAdaptorTest.java
0a1,39
> package org.apache.commons.dbutils.adaptors;
>
> import java.sql.SQLException;
>
> import org.apache.commons.dbutils.BaseTestCase;
> import org.apache.commons.dbutils.ResultSetHandler;
> import org.apache.commons.dbutils.TestBean;
> import org.apache.commons.dbutils.BasicRowProcessor;
> import org.apache.commons.dbutils.handlers.BeanHandler;
>
> import junit.textui.TestRunner;
>
> /**
> * BeanHandlerTest
> *
> * @author Corby Page
> */
> public class DriverAdaptorTest extends BaseTestCase
> {
> /**
> * Constructor for DriverAdaptorTest.
> */
> public DriverAdaptorTest( String name ) { > super( name ); > }
>
> public void testDriverAdaptor() throws SQLException { > ResultSetHandler h = new BeanHandler(TestBean.class, BasicRowProcessor.instance(), > DriverAdaptor.instance()); > TestBean results = (TestBean) h.handle(this.rs); > > assertNotNull(results); > assertEquals("1", results.getOne()); > assertEquals("2", results.getTwo()); > assertEquals("3", results.getThree()); > assertEquals("not set", results.getDoNotSet()); > assertEquals( 5, results.getDoubleTest(), 0 ); > }
> }

 All   Comments   Work Log   Change History   Subversion Commits      Sort Order: Ascending order - Click to sort in descending order
No work has yet been logged on this issue.