package cn.dreampie.orm; import cn.dreampie.common.entity.Conversion; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; /** * Created by ice on 14-12-30. */ public class BaseBuilder { // private static final Logger logger = Logger.getLogger(BaseBuilder.class); public static <T> List<T> build(ResultSet rs, Class<? extends Base> modelClass, DataSourceMeta dataSourceMeta, TableMeta tableMeta) throws SQLException, InstantiationException, IllegalAccessException { List<T> result = new ArrayList<T>(); ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); String[] labelNames = new String[columnCount + 1]; int[] types = new int[columnCount + 1]; buildLabelNamesAndTypes(rsmd, labelNames, types); Base entity; String name; Object value; Conversion conversion; while (rs.next()) { if (Record.class.isAssignableFrom(modelClass)) { entity = new Record(tableMeta); } else { entity = modelClass.newInstance(); } for (int i = 1; i <= columnCount; i++) { value = rs.getObject(i); name = labelNames[i]; conversion = entity.getConversion(name); if (conversion != null) { value = conversion.read(value); } entity.init(name, value); } result.add((T) entity); } return result; } private static void buildLabelNamesAndTypes(ResultSetMetaData rsmd, String[] labelNames, int[] types) throws SQLException { for (int i = 1; i < labelNames.length; i++) { labelNames[i] = rsmd.getColumnLabel(i); types[i] = rsmd.getColumnType(i); } } }