I found recently, that JDBC has two ways to name column, i.e. "by name" and "by label", while apparently "by label" way is default.
Actually, column name notion is appear to be confusing for me. And probably not only for me, but for Beanutils autors, because they access fields by name by defaults (resulting in inability to access any query with column aliases). Simultaneously they have property useColumnLabel
, which has no effect because it is set after introspection.
Here is the sample code
import org.apache.commons.beanutils.*;
import java.lang.reflect.InvocationTargetException;
import java.sql.*;
import java.util.ArrayList;
import java.util.Iterator;
public class ResultSetIteratorAttempt {
public static void main(String[] args) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Connection conn = null;
Statement stmt = null;
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/sample","java","");
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT Id as NM1, Name as NM2 FROM DayOfWeek;");
ArrayList results = new ArrayList(); // To hold copied list
ResultSetDynaClass rsdc = new ResultSetDynaClass(rs);
rsdc.setUseColumnLabel(true);
DynaProperty[] properties = rsdc.getDynaProperties();
String propertyName = "";
for(int i=0; i<properties.length; ++i) {
propertyName = properties[i].getName();
System.out.println(String.format("Property #%d is %s", i, propertyName));
}
Iterator rows = rsdc.iterator();
DynaBean row;
while (rows.hasNext()) {
row = (DynaBean) rows.next();
System.out.println(String.format("Row is %s", row.get(propertyName)));
}
}
}
Am I right?
UDPATE
mysql> select * from dayofweek;
+----+-----------+
| Id | Name |
+----+-----------+
| 5 | Friday |
| 1 | Monday |
| 6 | Saturday |
| 7 | Sunday |
| 4 | Thursday |
| 2 | Tuesday |
| 3 | Wednesday |
+----+-----------+
7 rows in set (0.00 sec)
Bug is known https://issues.apache.org/jira/browse/BEANUTILS-383
Workaround it to use alternative constructor signature, which is accepting three parameters.