我正在尝试将信息从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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您遇到的问题是数据插入时,MySQL数据库报出DataIntegrityViolationException
,指出列“test2”不能为空。这意味着在尝试通过Spring Batch将数据从Excel文件写入MySQL表时,至少有一条记录的“test2”字段值为null,而该列在数据库中被设置为非空约束。
要解决这个问题,请按照以下步骤操作:
检查数据源:首先确认Excel文件中的数据是否完整,特别是每一行的“test2”列是否有缺失值。如果Excel文件中存在空白或null值,您需要决定如何处理这些情况,比如用默认值填充、忽略这些记录或者抛出异常提示用户修正数据。
数据预处理:在您的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();
}
日志和调试:增加日志记录,特别是在读取、处理和写入阶段,这样可以帮助您跟踪问题数据的具体位置,从而更快地定位并解决问题。
数据库验证:再次确认数据库表结构,了解哪些字段设置了NOT NULL约束,并确保Spring Batch配置与之匹配,没有遗漏必要的字段映射。
事务管理:考虑Spring Batch作业的事务管理策略,确保在发生错误时能够适当地回滚,避免部分成功部分失败的数据写入。
通过上述步骤,您应该能识别并解决导致“test2”列不能为null的错误。