package foundation.data.object; import java.sql.PreparedStatement; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import foundation.data.entity.Entity; import foundation.data.entity.EntitySet; import foundation.persist.ISavable; import foundation.persist.NamedSQL; import foundation.persist.SQLRunner; import foundation.persist.source.NamedDataSource; import foundation.variant.provider.IVariantsProvider; public class BatchEntitySaver implements ISavable { private static Logger logger; private NamedDataSource dataSource; private EntitySet entitySet; private int savedCount; private int totalSavedCount; static { logger = LogManager.getLogger(BatchEntitySaver.class); } public BatchEntitySaver(NamedDataSource dataSource) throws Exception { this.dataSource = dataSource; } public int save(EntitySet entitySet, IVariantsProvider... providers) throws Exception { this.entitySet = entitySet; NamedSQL namedSQL = NamedSQL.getInstance(dataSource.getDBaseType(), "batchInsertEntity"); try { namedSQL.setVariants(null, providers); SQLRunner.saveData(namedSQL, this); } catch(Exception e) { printError(namedSQL, e); throw e; } return savedCount; } @Override public void saveData(PreparedStatement stmt, Object... agrs) throws Exception { int fieldCount = entitySet.getFieldCount(); for (Entity entity: entitySet) { for (int i = 0; i < fieldCount; i++) { Object object = entity.getFieldTypeValue(i); stmt.setObject(i + 1, object); } stmt.addBatch(); } stmt.executeBatch(); stmt.clearBatch(); savedCount = entitySet.size(); totalSavedCount = totalSavedCount + savedCount; } 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); } } public int getSavedCount() { return savedCount; } public int getTotalSavedCount() { return totalSavedCount; } }