package com.megatim.fdxcommons.tools.database.queries;
|
|
import com.megatim.fdxcommons.tools.database.contrat.DefaultPreparedStatementProcessor;
|
import com.megatim.fdxcommons.tools.database.contrat.PreparedStatementProcessor;
|
import com.megatim.fdxcommons.tools.database.contrat.QueryMetaData;
|
import com.megatim.fdxcommons.tools.database.contrat.TypeFichierDataColumn;
|
import com.megatim.fdxcommons.tools.database.contrat.TypeFichierDataRow;
|
import com.megatim.fdxcommons.tools.database.queries.metadata.DefaultTypeFichierDataColumn;
|
import com.megatim.fdxcommons.tools.database.queries.metadata.QueryParam;
|
import java.sql.Connection;
|
import java.sql.PreparedStatement;
|
import java.sql.SQLException;
|
import java.util.ArrayList;
|
import java.util.List;
|
|
/**
|
*
|
* @author Gabuntu
|
*/
|
public class InsertQuery implements QueryMetaData<Void> {
|
|
private final String tableName;
|
protected final Connection connection;
|
private final List<String> columnNames;
|
private final List<TypeFichierDataRow> rows;
|
private final List<DefaultTypeFichierDataColumn> dataColumnsToAdd;
|
private final int BATCH_SIZE = 100_000;
|
|
public InsertQuery(String tableName, final Connection connection, List<DefaultTypeFichierDataColumn> dataColumnsToAdd, List<String> columnNames, List<TypeFichierDataRow> rows) {
|
this.tableName = tableName;
|
this.dataColumnsToAdd = dataColumnsToAdd;
|
this.connection = connection;
|
this.columnNames = columnNames;
|
this.rows = rows;
|
}
|
|
@Override
|
public Void execute() throws Exception {
|
System.out.println("<-------------------------------------------------------------------------->");
|
System.out.println(insertQueryString());
|
System.out.println("<-------------------------------------------------------------------------->");
|
|
try ( PreparedStatement statement = connection.prepareStatement(insertQueryString());) {
|
|
executeInBatch(statement, rows, dataColumnsToAdd);
|
statement.executeBatch();
|
}
|
return null;
|
}
|
|
private String insertQueryString() {
|
List<String> insertColumns = new ArrayList<>(columnNames);
|
|
for (DefaultTypeFichierDataColumn dc : dataColumnsToAdd) {
|
insertColumns.add(dc.column());
|
}
|
|
StringBuilder query = new StringBuilder("INSERT INTO " + tableName + "(");
|
|
insertColumns.forEach(column -> query.append(column).append(","));
|
|
query.replace(query.length() - 1, query.length(), ") VALUES(");
|
|
insertColumns.forEach(s -> query.append("?,"));
|
|
query.replace(query.length() - 1, query.length(), ")");
|
|
return query.toString();
|
}
|
|
private void executeInBatch(PreparedStatement preparedStatement, List<TypeFichierDataRow> rows, List<DefaultTypeFichierDataColumn> dataColumnsToAdd) throws SQLException, Exception {
|
|
int index = 0;
|
int count = 0;
|
|
for (TypeFichierDataRow row : rows) {
|
|
List<QueryParam> queryParameters = new ArrayList<>();
|
|
for (TypeFichierDataColumn dataColumn : row.columns()) {
|
queryParameters.add(new QueryParam(dataColumn.column(), dataColumn.value()));
|
}
|
|
//On ajoute les colonnes de dataColumnsToAdd
|
for (DefaultTypeFichierDataColumn dc : dataColumnsToAdd) {
|
queryParameters.add(new QueryParam(dc.column(), dc.value()));
|
}
|
|
PreparedStatementProcessor statementProcessor = new DefaultPreparedStatementProcessor(index);
|
statementProcessor.process(preparedStatement, queryParameters);
|
index = statementProcessor.lastProcessedIndex();
|
|
preparedStatement.addBatch();
|
|
if (++count % BATCH_SIZE == 0) {
|
preparedStatement.executeBatch();
|
}
|
|
}
|
|
}
|
|
}
|