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);
|
}
|
}
|
|
}
|