DeleteGlassesJdbcBatchItemWriter.java

package com.sintia.ffl.admin.optique.catalogue.batch.writer.purgeglasses;

import com.sintia.ffl.admin.optique.catalogue.batch.reporter.PurgeVerreReporter;
import com.sintia.ffl.admin.optique.services.dto.Glasses;
import org.springframework.batch.item.ItemWriter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

@Component
public class DeleteGlassesJdbcBatchItemWriter implements ItemWriter<Glasses> {

	private final JdbcTemplate template;

	private final PurgeVerreReporter purgeVerreReporter;

	@Autowired
	public DeleteGlassesJdbcBatchItemWriter(
			DataSource dataSource,
			PurgeVerreReporter purgeVerreReporter
	) {
		this.template = new JdbcTemplate(dataSource);
		this.purgeVerreReporter = purgeVerreReporter;
	}

	@Override
	public void write(@NonNull List<? extends Glasses> items) throws Exception {
		int[] results = this.template.batchUpdate(
				"delete from modele_verre where c_opto_code_verre=? AND id_distributeur=? AND id_fabricant=?",
				new BatchPreparedStatementSetter() {

					@Override
					public void setValues(@NonNull PreparedStatement ps, int i) throws SQLException {
						Glasses item = items.get(i);
						ps.setString(1, item.getGlassOptoCode());
						ps.setInt(2, Integer.parseInt(item.getProvider()));
						ps.setInt(3, Integer.parseInt(item.getMaker()));
					}

					@Override
					public int getBatchSize() {
						return items.size();
					}
				});
		int totalDeleted = 0;
		for (int nbDeleted : results) {
			totalDeleted += nbDeleted;
		}
		purgeVerreReporter.addGlassesDeleted(totalDeleted);

	}
}