package foundation.io.engine; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.data.meta.field.FieldRuntimeCreator; import foundation.data.meta.field.FieldsRuntime; import foundation.data.meta.field.ResultMetaFieldReader; import foundation.io.define.IOSQLContext; import foundation.persist.ILoadable; import foundation.persist.NamedSQL; import foundation.persist.SQLRunner; public class BatchEntityLoader implements ILoadable { private static Logger logger; private IOSQLContext ioContext; private FieldsRuntime fieldsMeta; private EntitySet entitySet; private int batchCount; static { logger = LogManager.getLogger(BatchEntityLoader.class); } public BatchEntityLoader(IOSQLContext ioContext) throws Exception { this.ioContext = ioContext; } public EntitySet load(int batchCount) throws Exception { this.batchCount = batchCount; NamedSQL namedSQL = NamedSQL.getInstance("batchSelectFromTable"); try { ioContext.setParametersTo(namedSQL); SQLRunner.getData(namedSQL, this); } catch(Exception e) { printError(namedSQL, e); throw e; } return entitySet; } @Override public void load(ResultSet rslt, Object... args) throws Exception { if (fieldsMeta == null) { loadMeta(rslt.getMetaData()); } entitySet = new EntitySet(fieldsMeta, batchCount); int lineNo = 1; try { int fieldCount = fieldsMeta.getFieldCount(); while (rslt.next()) { Entity entity = entitySet.append(); //1. set value for (int j = 0; j < fieldCount; j++) { Object object = rslt.getObject(j + 1); entity.set(j, object); } lineNo++; } } catch (Exception e) { String error = "获取第" + lineNo + "行数据时发生错误:" + e.getMessage(); throw new Exception(error); } } private void loadMeta(ResultSetMetaData metaData) throws Exception { ResultMetaFieldReader fieldReader = new ResultMetaFieldReader(metaData); fieldsMeta = FieldRuntimeCreator.create(fieldReader); } private void printError(NamedSQL namedSQL, Exception e) { logger.error("load data error:"); try { logger.error("sql:" + namedSQL.toString()); if (entitySet != null) { int i = 1; for (Entity entity: entitySet) { logger.error("line" + i + ":" + entity.toString()); i++; if (i > 5) { break; } } } } catch (Exception e1) { logger.error(e1); } } }