package com.nfwork.dbfound.model.reflector; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Date; import java.util.List; import com.nfwork.dbfound.core.Context; import com.nfwork.dbfound.util.DataUtil; public class ReflectorUtil { public static <T> List<T> parseResultList(Class<T> clazz, ResultSet rs, Context context) throws SQLException { List<T> array = new ArrayList<T>(); if (rs != null) { ResultSetMetaData md = rs.getMetaData(); int columnCount = md.getColumnCount(); Reflector reflector = Reflector.forClass(clazz); int totalCounts = 0; while (rs.next()) { if (context.queryLimit && ++totalCounts > context.queryLimitSize) { break; } ObjectFactory objectFactory = new DefaultObjectFactory(); T obj = objectFactory.create(clazz); for (int i = 1; i <= columnCount; i++) { String columname = md.getColumnLabel(i); if (DataUtil.isNull(columname)) { columname = md.getColumnName(i); } String propertyname = reflector.getFieldName(columname); if (reflector.hasSetter(propertyname)) { Object columnvalue = rs.getObject(i); if (columnvalue != null) { Class<?> fieldtype = reflector.getSetterType(propertyname); if (fieldtype.equals(Short.class) || fieldtype.equals(short.class)) { columnvalue = rs.getShort(i); } else if (fieldtype.equals(Byte.class) || fieldtype.equals(byte.class)) { columnvalue = rs.getByte(i); } else if (fieldtype.equals(Integer.class) || fieldtype.equals(int.class)) { columnvalue = rs.getInt(i); } else if (fieldtype.equals(Long.class) || fieldtype.equals(long.class)) { columnvalue = rs.getLong(i); } else if (fieldtype.equals(Float.class) || fieldtype.equals(float.class)) { columnvalue = rs.getFloat(i); } else if (fieldtype.equals(Double.class) || fieldtype.equals(double.class)) { columnvalue = rs.getDouble(i); } else if (fieldtype.equals(Boolean.class) || fieldtype.equals(boolean.class)) { columnvalue = rs.getBoolean(i); } else if (fieldtype.equals(Date.class)) { columnvalue = rs.getTimestamp(i); } else if (fieldtype.equals(java.sql.Date.class)) { Timestamp timestamp = rs.getTimestamp(i); columnvalue = new java.sql.Date(timestamp.getTime()); } else if (fieldtype.equals(String.class)) { columnvalue = rs.getString(i); } try { reflector.getSetInvoker(propertyname).invoke(obj, new Object[] { columnvalue }); } catch (Exception e) { throw new RuntimeException(e); } } } } array.add(obj); } } return array; } }