In C#, I got an utility that cast Datatable into a list of specified model, like this:
Datatable dt = conn.GetDataTable();
List<BookModel> result = EntityHelper<BookModel>.GetListModel(dataTable);
And the GetListModel() method that using generic type goes like this:
public static List<T> GetListModel(DataTable dt)
{
List<T> lObject= new List<T>();
for (int i = 0; i < dt.Rows.Count; i++)
{
T obj = new T();
for (int j = 0; j < dt.Columns.Count; j++)
{
int index = IndexOfField( dt.Columns[j].ColumnName );
if (index != -1)
{
PropertyInfo pi = obj.GetType().GetProperties()[index];
Type propType = pi.PropertyType;
if (propType.IsGenericType && (propType.GetGenericTypeDefinition() == typeof( Nullable<> )))
{
propType = propType.GetGenericArguments()[0];
}
if (propType.IsEnum)
{
int objectValue = 0;
Int32.TryParse( dt.Rows[i][j].ToString(), out objectValue );
pi.SetValue( obj, Enum.ToObject( propType, objectValue ), null );
}
else if (dt.Columns[j].DataType == propType && dt.Rows[i][j] != DBNull.Value)
{
pi.SetValue( obj, dt.Rows[i][j], null );
}
else if ((propType.Name.Equals( "Boolean" ) || propType.Name.Equals( "bool" )) && dt.Rows[i][j] != DBNull.Value)
{
pi.SetValue( obj, Convert.ToBoolean( dt.Rows[i][j] ), null );
}
}
}
lObject.Add( obj );
}
return lObject;
}
That is C# story, now back to Java. I'm using JDBC to execute a stored proc and return a ResultSet. But I found that in Java, generic type got its information erased at the runtime so I cannot do something like this:
public static <T> List<T> castObject(ResultSet rs)
{
T x = new T(); //IMPOSSIBLE ;___;
Field[] fields = x.getClass().getDeclaredFields();
for(Field field: fields)
{
field.setAccessible(true);
}
....
}
If it's impossible to create an utility like this, then is there anyway to reduce boilerplate code after getting a resulset ? My table got like 30 columns and I do not want to deal with codes like this:
actor.setFirstName(rs.getString("first_name"));
actor.setLastName(rs.getString("last_name"));
...
Aucun commentaire:
Enregistrer un commentaire