P15GEN2\59518
2025-10-10 9f6890646993d16260d4201d613c092132856127
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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.data.meta.field.Field;
import foundation.data.meta.field.FieldsRuntime;
import foundation.persist.ISavable;
import foundation.persist.NamedSQL;
import foundation.persist.SQLRunner;
import foundation.persist.source.NamedDataSource;
import foundation.value.ITranslator;
import foundation.variant.provider.DataEvent;
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;
    private FieldsRuntime tableFieldMetas;
    private DataEvent dataEvent;
    
    static {
        logger = LogManager.getLogger(BatchEntitySaver.class);
    }
    
    
    public BatchEntitySaver(NamedDataSource dataSource, DataObject dataObject) throws Exception {
        this.dataSource = dataSource;
        tableFieldMetas = dataObject.getTableFieldMetas();
    }                                     
 
    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++) {
                Field field = tableFieldMetas.get(i);
                ITranslator translator = field.getValueTranslator();
                Object object = entity.getValue(field.getName());
                Object value = translator.load(object);
                
                stmt.setObject(i + 1, value);
            }
            
            if (dataEvent == DataEvent.Update) {
                stmt.setObject(fieldCount + 1, entity.getId());
            }
            
            stmt.addBatch();
        }
        
        stmt.executeBatch();
        stmt.clearBatch();
        
        savedCount = entitySet.size();
        totalSavedCount = totalSavedCount + savedCount;
    }
 
    public int update(EntitySet entitySet, IVariantsProvider... providers) throws Exception {
        this.entitySet = entitySet;
        
        NamedSQL namedSQL = NamedSQL.getInstance(dataSource.getDBaseType(), "batchUpdateEntity");
        
        try {
            namedSQL.setVariants(DataEvent.Update, providers);
            dataEvent = DataEvent.Update;
            SQLRunner.saveData(namedSQL, this);        
        }
        catch(Exception e) {
            printError(namedSQL, e);
            throw e;
        }
 
        return 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;
    }
    
}