您好我是Spring Batch的新手,我提到this link来运行示例程序。
我想将大量的CSV文件数据插入到MySQL数据库中,通过这个例子,我可以用有限数量的CSV数据行执行它。
但是当我在CSV文件中插入更多行并执行批处理程序时,它没有插入任何数据,换句话说它没有读取文件本身,甚至没有显示任何错误/异常。我想我需要配置ItemReader
多次阅读。
以下是BatchConfiguration.java代码
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
public ItemReader<Student> reader() {
FlatFileItemReader<Student> reader = new FlatFileItemReader<Student>();
reader.setResource(new ClassPathResource("student-data.csv"));
reader.setLineMapper(new DefaultLineMapper<Student>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[] {"stdId", "subMarkOne", "subMarkTwo" });
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Student>() {{
setTargetType(Student.class);
}});
}});
return reader;
}
@Bean
public ItemWriter<Marksheet> writer(DataSource dataSource) {
JdbcBatchItemWriter<Marksheet> writer = new JdbcBatchItemWriter<Marksheet>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Marksheet>());
writer.setSql("INSERT INTO marksheet (studentId,totalMark) VALUES (:stdId,:totalSubMark)");
writer.setDataSource(dataSource);
return writer;
}
@Bean
public ItemProcessor<Student, Marksheet> processor() {
return new StudentItemProcessor();
}
@Bean
public Job createMarkSheet(JobBuilderFactory jobs, Step step) {
return jobs.get("createMarkSheet")
.flow(step)
.end()
.build();
}
@Bean
public Step step(StepBuilderFactory stepBuilderFactory, ItemReader<Student> reader,
ItemWriter<Marksheet> writer, ItemProcessor<Student, Marksheet> processor) {
return stepBuilderFactory.get("step")
.<Student, Marksheet> chunk(5)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean
public DataSource getDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/concretepage");
dataSource.setUsername("root");
dataSource.setPassword("root123");
return dataSource;
}
要运行的主要课程
@ComponentScan
@EnableAutoConfiguration
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Main.class, args);
List<Marksheet> result = ctx.getBean(JdbcTemplate.class).query("select studentId,totalMark FROM marksheet",
new RowMapper<Marksheet>() {
@Override
public Marksheet mapRow(ResultSet rs, int row) throws SQLException {
return new Marksheet(rs.getString(1), Integer.parseInt(rs.getString(2)));
}
});
System.out.println("Number of Record:"+result.size());
}
}
流程类
public class StudentItemProcessor implements ItemProcessor<Student, Marksheet> {
@Override
public Marksheet process(final Student student) throws Exception {
int totalMark = student.getSubMarkOne()+student.getSubMarkTwo();
System.out.println("student id:"+student.getStdId() +" and Total mark:"+ totalMark);
Marksheet marksheet = new Marksheet(student.getStdId(), totalMark);
return marksheet;
}
}
任何帮助将不胜感激。谢谢。