我正在尝试将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)
1条答案
按热度按时间q8l4jmvw1#
由于在insert语句中使用的是命名参数,因此需要注入
NamedParameterJdbcTemplate
你的作者。还要确保参数名与Pagare
类型(您没有共享)。