我不能用spring批处理插入mysql数据库

krcsximq  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(394)

我正在尝试将excel文件中的信息插入mysql,我正在使用springbatchexcel的扩展名来读取文件,但是当尝试插入mysql时,它给出了一个错误,显然它没有发送我共享的信息 batch.config ```
@Configuration
@EnableBatchProcessing
public class SpringBatchConfig {

@Bean
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE)
public Pagare pagare() {
    return new Pagare();
}

@Bean
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE)
public ItemProcessor<Pagare, Pagare> itemProcessor() {
    return new PagareItemProcessor();
}

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    // dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/pagare");
    dataSource.setUsername("root");
    dataSource.setPassword("");
    ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
    databasePopulator.addScript(new ClassPathResource("org/springframework/batch/core/schema-drop-mysql.sql"));
    databasePopulator.addScript(new ClassPathResource("org/springframework/batch/core/schema-mysql.sql"));
    DatabasePopulatorUtils.execute(databasePopulator, dataSource);
    return dataSource;
}

@Bean
public BeanWrapperFieldSetMapper<Pagare> beanWrapperFieldSetMapper() {
    BeanWrapperFieldSetMapper<Pagare> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
    fieldSetMapper.setPrototypeBeanName("pagare");
    return fieldSetMapper;
}

@Bean
ItemReader<Pagare> pagareReader() {
    PoiItemReader<Pagare> reader = new PoiItemReader<>();
    reader.setResource(new ClassPathResource("pagares.xlsx"));
    reader.setRowMapper(excelRowMapper());
    return reader;
}

private RowMapper<Pagare> excelRowMapper() {
    return new RowMapperImpl();
}

@Bean
public BeanPropertyItemSqlParameterSourceProvider<Pagare> beanPropertyItemSqlParameterSourceProvider() {
    return new BeanPropertyItemSqlParameterSourceProvider<>();
}

@Bean
public ItemWriter<Pagare> JdbcBatchItemWriter(DataSource dataSource,
                                              BeanPropertyItemSqlParameterSourceProvider<Pagare> sqlParameterSourceProvider) {
    JdbcBatchItemWriter<Pagare> jdbcBatchItemWriter = new JdbcBatchItemWriter<>();
    jdbcBatchItemWriter.setDataSource(dataSource);
    jdbcBatchItemWriter.setItemSqlParameterSourceProvider(sqlParameterSourceProvider);
    jdbcBatchItemWriter.setSql("insert into pagare(operacion,id,contrato,tipo,analista,fechaCargaDocumento,estadoOperacion,fechaCambioEstado) values (:operacion, :id, :contrato, :tipo, :analista, :fechaCargaDocumento, :estadoOperacion, :fechaCambioEstado)");

    return jdbcBatchItemWriter;
}

@Bean
public Job jobCsvMysql(JobBuilderFactory jobBuilderFactory, Step step) {
    return jobBuilderFactory.get("jobCsvMysql").incrementer(new RunIdIncrementer()).flow(step).end().build();
}

@Bean
public Step step1(StepBuilderFactory stepBuilderFactory,
                  ItemReader<Pagare> pagareReader, ItemWriter<Pagare> writer, ItemProcessor<Pagare, Pagare> processor) {
    return stepBuilderFactory.get("step1").<Pagare, Pagare>chunk(6)
            .reader(pagareReader).processor(processor).writer(writer).build();
}

}

org.springframework.dao.dataintegrityviolationexception:preparedstatementcallback;sql[插入pagare(test1,id,test3,test4,test5,test6,test7,test8)值(?,?,?,?,?,?)];“id”列不能为空;嵌套异常为java.sql.batchupdateexception:列“test2”不能为null
我试着改变价值观​​对于我的bd和我的模型,我有相同的结果,我之所以使用beanpropertyitemsqlparametersourceprovider是因为我的insert参数等于我在下面留下的模型属性的参数

public class Pagare {
private String operacion;
private String rut;
private String contrato;
private String tipo;
private String analista;
private String fechaCargaDocumento;
private String estadoOperacion;
private String fechaCambioEstado;

public String getOperacion() {
    return operacion;
}

public void setOperacion(String operacion) {
    this.operacion = operacion;
}

public String getTipo() {
    return tipo;
}

public void setTipo(String tipo) {
    this.tipo = tipo;
}

public String getAnalista() {
    return analista;
}

public void setAnalista(String analista) {
    this.analista = analista;
}

public String getFechaCargaDocumento() {
    return fechaCargaDocumento;
}

public void setFechaCargaDocumento(String fechaCargaDocumento) {
    this.fechaCargaDocumento = fechaCargaDocumento;
}

public String getEstadoOperacion() {
    return estadoOperacion;
}

public void setEstadoOperacion(String estadoOperacion) {
    this.estadoOperacion = estadoOperacion;
}

public String getFechaCambioEstado() {
    return fechaCambioEstado;
}

public void setFechaCambioEstado(String fechaCambioEstado) {
    this.fechaCambioEstado = fechaCambioEstado;
}

public String getRut() {
    return rut;
}

public void setRut(String rut) {
    this.rut = rut;
}

public String getContrato() {
    return contrato;
}

public void setContrato(String contrato) {
    this.contrato = contrato;
}

@Override
public String toString() {
    return "Pagare [operacion=" + operacion + ", rut=" + rut + ", contrato=" + contrato + ",tipo=" + tipo + ",analista=" + analista + ",fechaCargaDocumento=" + fechaCargaDocumento + ",estadoOperacion=" + estadoOperacion + ",fechaCambioEstado=" + fechaCambioEstado + "]";
}
我的物品处理器是这个

private static final Logger LOG = LoggerFactory.getLogger(PagareItemProcessor.class);

@Override
public Pagare process(Pagare pagare) throws Exception {

    LOG.info("Processing " + pagare);

    final String initCapAnalista = pagare.getAnalista().substring(0, 1).toUpperCase()
            + pagare.getAnalista().substring(1);
    final String initCapTipo = pagare.getTipo().substring(0, 1).toUpperCase()
            + pagare.getTipo().substring(1);
    Pagare transformedPagare = new Pagare();
    transformedPagare.setOperacion(pagare.getOperacion());
    transformedPagare.setAnalista(initCapAnalista);
    transformedPagare.setTipo(initCapTipo);
    return transformedPagare;

}

}
此图为控制台读取文件时出错
![](https://i.stack.imgur.com/VAE2I.png)
q8l4jmvw

q8l4jmvw1#

由于在insert语句中使用的是命名参数,因此需要注入 NamedParameterJdbcTemplate 你的作者。还要确保参数名与 Pagare 类型(您没有共享)。

相关问题