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]