开发者社区 问答 正文

我无法使用Spring Batch插入mysql数据库

我正在尝试将信息从excel文件插入到mysql中,我正在使用springbatch excel扩展名来读取文件,但是当尝试插入mysql时出现错误,显然它不发送我共享我的batch.config的信息

@Bean public BeanWrapperFieldSetMapper beanWrapperFieldSetMapper() { BeanWrapperFieldSetMapper 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> writer(DataSource dataSource,
                                              BeanPropertyItemSqlParameterSourceProvider<Pagare> sqlParameterSourceProvider) {
    JdbcBatchItemWriter<Pagare> jdbcBatchItemWriter = new JdbcBatchItemWriter<>();
    jdbcBatchItemWriter.setDataSource(dataSource);
    jdbcBatchItemWriter.setItemSqlParameterSourceProvider(sqlParameterSourceProvider);
    jdbcBatchItemWriter.setSql("insert into pagare(test1,test2,test3,test4,test5,test6,test7,test8) values (:test1, :test2, :test3, :test4, :test5, :test6, :test7, :test8)");



    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(10)
            .reader(pagareReader).processor(processor).writer(writer).build();
}

org.springframework.dao.DataIntegrityViolationException:PreparedStatementCallback; SQL [插入pagare(test1,test2,test3,test4,test5,test6,test7,test8)值(?,?,?,?,?,?,?,?)] 列“ test2”不能为空;嵌套异常为java.sql.BatchUpdateException:列“ test2”不能为null

展开
收起
保持可爱mmm 2019-11-15 11:51:22 642 分享 版权
阿里云 AI 助理回答

您遇到的问题是数据插入时,MySQL数据库报出DataIntegrityViolationException,指出列“test2”不能为空。这意味着在尝试通过Spring Batch将数据从Excel文件写入MySQL表时,至少有一条记录的“test2”字段值为null,而该列在数据库中被设置为非空约束。

要解决这个问题,请按照以下步骤操作:

  1. 检查数据源:首先确认Excel文件中的数据是否完整,特别是每一行的“test2”列是否有缺失值。如果Excel文件中存在空白或null值,您需要决定如何处理这些情况,比如用默认值填充、忽略这些记录或者抛出异常提示用户修正数据。

  2. 数据预处理:在您的ItemProcessor中添加逻辑来处理可能为空的字段。例如,您可以创建一个自定义的处理器类(如果您还没有的话),并在其中检查每个字段的值,确保它们不为空。如果发现某个字段为空,可以采取相应的补救措施,如使用默认值填充。

public class RowProcessorImpl implements ItemProcessor<YourInputType, YourOutputType> {

    @Override
    public YourOutputType process(YourInputType item) throws Exception {
        // 假设YourInputType有getTest2()方法,且test2字段不应为空
        if (item.getTest2() == null) {
            // 处理逻辑,比如设置默认值
            item.setTest2("默认值");
        }
        
        // 根据需要处理其他字段
        // ...
        
        return item; // 返回处理后的对象
    }
}

然后,在配置中引用这个处理器:

@Bean
public ItemProcessor<YourInputType, YourOutputType> processor() {
    return new RowProcessorImpl();
}
  1. 日志和调试:增加日志记录,特别是在读取、处理和写入阶段,这样可以帮助您跟踪问题数据的具体位置,从而更快地定位并解决问题。

  2. 数据库验证:再次确认数据库表结构,了解哪些字段设置了NOT NULL约束,并确保Spring Batch配置与之匹配,没有遗漏必要的字段映射。

  3. 事务管理:考虑Spring Batch作业的事务管理策略,确保在发生错误时能够适当地回滚,避免部分成功部分失败的数据写入。

通过上述步骤,您应该能识别并解决导致“test2”列不能为null的错误。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答