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 { private final String tableName; protected final Connection connection; private final List columnNames; private final List rows; private final List dataColumnsToAdd; private final int BATCH_SIZE = 100_000; public InsertQuery(String tableName, final Connection connection, List dataColumnsToAdd, List columnNames, List 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 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 rows, List dataColumnsToAdd) throws SQLException, Exception { int index = 0; int count = 0; for (TypeFichierDataRow row : rows) { List 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(); } } } }