Dear dbutil folks,

        I am a newbie to this package.  I was really excited because I do not 
know much about databases and was hoping that this package could hide most of 
the details from me.  (Yes, I know I should understand everything, but I simply 
do not have the time.)

        I spent a pretty good amount of time grappling with how to get this 
utility to work with my existing database table and my existing JavaBean.  The 
issue I was running into was that the column names did not match the JavaBean 
property names.  I finally found the answer in the forums, but guessing that my 
situation is not unique, I was wondering if you might possibly add some 
additional documentation to the Example page, at the end of the 
"ResultSetHandler Implementations" section.  Below I have provided a first 
draft.  Since I do not know what the submission process is, I am willing to 
work with the editor if need be.  (I figured I spent some time with this issue 
and, if possible, might as well try to save others some time.)

        In addition, I am wondering if it might be possible to overload the 
BeanHandler constructor so that it also takes a boolean argument.  This 
argument would be a flag to indicate if the underscore character ought to be 
ignored when matching column names to JavaBean properties.  This would require 
several changes, but the biggest change, I think, would occur in the method 
org.apache.commons.dbutils.BeanProcessor.mapColumnsToProperties(ResultSetMetaData
 rsmd, PropertyDescriptor[] props).  Below I have taken a first cut at the 
modified implementation.

thanks,
-markus

http://jakarta.apache.org/commons/dbutils/examples.html

--- START draft of additional documentation

        Using the BeanHandler potentially adds a new requirement - it requires 
that the names of the column in the database match the property names defined 
of the JavaBean.  In the above example, that means that if the columns in the 
database table "Person" were named "PERSON_ID", "NAME", "FIRST_NAME", and 
"LAST_NAME", then the properties of the JavaBean Person.java must be named 
"person_id", "name", "first_name", and "last_name".  (Note that the case does 
not have to match.)  Such an example is a real world reality in that many DBAs, 
er, encourage a naming schema that contains only capital letters and where each 
word is separated by the underscore character.

        There are two potential solutions to this issue:  (1) re-write the 
SELECT statement to use the "AS" SQL keyword, or (2) use an overloaded 
constructor of BeanHandler.

        So, given a JavaBean with properties "person_id", "name", "first_name", 
and "last_name"...
        The first solution requires that you change the SQL statement to 
"SELECT PERSON_ID AS personId, NAME, FIRST_NAME AS firstName, LAST_NAME AS 
lastName FROM Person WHERE name=?".  (Note that the AS keyword is not used with 
the column named NAME since it matches the property name.)
        The second solution requires you to change the line "ResultSetHandler h 
= new BeanHandler(Person.class);" to "ResultSetHandler h = new 
BeanHandler(Person.class, true);". (Note passing the boolean value true as the 
second argument in the constrcutor.)

--- END draft of additional documentation


http://cvs.apache.org/viewcvs.cgi/jakarta-commons/dbutils/src/java/org/apache/commons/dbutils/BeanProcessor.java?rev=1.7&sortdir=down&view=auto

-- START original --

protected int[] mapColumnsToProperties(ResultSetMetaData rsmd,
            PropertyDescriptor[] props) throws SQLException {

        int cols = rsmd.getColumnCount();
        int columnToProperty[] = new int[cols + 1];
        Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);

        for (int col = 1; col <= cols; col++) {
            String columnName = rsmd.getColumnName(col);
            for (int i = 0; i < props.length; i++) {

                if (columnName.equalsIgnoreCase(props[i].getName())) {
                    columnToProperty[col] = i;
                    break;
                }
            }
        }

        return columnToProperty;
    }

-- END original --

-- START modified --

protected int[] mapColumnsToProperties(ResultSetMetaData rsmd,
            PropertyDescriptor[] props) throws SQLException {
        return mapColumnsToProperties(rsmd, props, false);
}


protected int[] mapColumnsToProperties(ResultSetMetaData rsmd,
            PropertyDescriptor[] props, boolean ignoreUnderscore) throws 
SQLException {

        int cols = rsmd.getColumnCount();
        int columnToProperty[] = new int[cols + 1];
        Arrays.fill(columnToProperty, PROPERTY_NOT_FOUND);

        for (int col = 1; col <= cols; col++) {
            String columnName = rsmd.getColumnName(col);
                String columnNameUnderscoreRemoved = columnName.".replace('_', 
'');
            for (int i = 0; i < props.length; i++) {

                if (columnName.equalsIgnoreCase(props[i].getName())) {
                    columnToProperty[col] = i;
                    break;
                } // end of IF
                else if ( 
                           (ignoreUnderscore) && 
                           (columnNameUnderscoreRemoved 
.equalsIgnoreCase(props[i].getName())) 
                         ) {
                    columnToProperty[col] = i;
                    break;
                } // end of ELSE IF
            } // end of FOR
        }

        return columnToProperty;
    }

-- END modified --

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to