FlatFileItemReader 从普通文件中读取数据
@Slf4j
@Configuration
@EnableBatchProcessing
public class FlatFileItemReaderDemo {
@Resource
private JobBuilderFactory jobBuilderFactory;
@Resource
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job fileItemReaderJob() throws Exception {
return jobBuilderFactory.get("flatFileReaderJob")
.start(fileItemReaderStep())
.build();
}
@Bean
public Step fileItemReaderStep() throws Exception {
return stepBuilderFactory.get("flatFileReaderStep")
.<Student, Student>chunk(5)
.reader(flatFileReader())
.writer(flatFileWriter())
.build();
}
public FlatFileItemReader<Student> flatFileReader() {
FlatFileItemReader<Student> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("student.txt"));
reader.setLinesToSkip(1);
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames(new String[]{"id", "name", "age"});
DefaultLineMapper<Student> mapper = new DefaultLineMapper<>();
mapper.setLineTokenizer(tokenizer);
mapper.setFieldSetMapper(new FieldSetMapper<Student>() {
@Override
public Student mapFieldSet(FieldSet fieldSet) throws BindException {
Student stu = new Student();
stu.setId(fieldSet.readInt("id"));
stu.setName(fieldSet.readString("name"));
stu.setAge(fieldSet.readInt("age"));
return stu;
}
});
mapper.afterPropertiesSet();
reader.setLineMapper(mapper);
return reader;
}
public FlatFileItemWriter<? super Student> flatFileWriter() throws Exception {
FlatFileItemWriter<Student> writer = new FlatFileItemWriter<>();
String path = "C:\\Users\\miles\\Desktop\\SpringBatch_demo\\src\\main\\resources\\FlatFileItemWriter.txt";
writer.setResource(new FileSystemResource(path));
writer.setLineAggregator(new LineAggregator<Student>() {
final ObjectMapper mapper = new ObjectMapper();
@Override
public String aggregate(Student item) {
String str = null;
try {
str = mapper.writeValueAsString(item);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return str;
}
});
writer.afterPropertiesSet();
return writer;
}
}
从数据库中读取数据
@Bean
@StepScope
public ItemReader<? extends Student> jdbcReader() {
JdbcPagingItemReader<Student> reader = new JdbcPagingItemReader<>();
reader.setDataSource(dataSource);
reader.setFetchSize(2);
log.info("ItemReader读取一次数据...");
reader.setRowMapper((result, rowNum) -> {
Student student = new Student();
student.setId(result.getInt(1));
student.setName(result.getString(2));
student.setAge(result.getInt(3));
return student;
});
reader.setRowMapper((result, rowNum) -> {
Student student = new Student();
student.setId(result.getInt(1));
student.setName(result.getString(2));
student.setAge(result.getInt(3));
return student;
});
MySqlPagingQueryProvider provider = new MySqlPagingQueryProvider();
provider.setSelectClause("id, name, age");
provider.setFromClause("from student");
Map<String, Order> sort = new HashMap<>(1);
sort.put("age", Order.DESCENDING);
provider.setSortKeys(sort);
reader.setQueryProvider(provider);
return reader;
}
@Bean
public JdbcBatchItemWriter<? super Student> dbWriter() {
log.info("JdbcBatchItemWriter, 写数据到数据库...");
JdbcBatchItemWriter<Student> writer = new JdbcBatchItemWriter<>();
writer.setDataSource(dataSource);
writer.setSql("insert into student(id,name,age) values (:id,:name,:age)");
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
return writer;
}
MultiFileItemReader 同时从多个文件中读取数据
@Slf4j
@Configuration
@EnableBatchProcessing
public class MultiFileReaderDemo {
@Resource
private JobBuilderFactory jobBuilderFactory;
@Resource
private StepBuilderFactory stepBuilderFactory;
@Value("classpath:/file*.txt")
private org.springframework.core.io.Resource[] filesResources;
@Bean
public Job multiFileReaderJob() throws Exception {
return jobBuilderFactory.get("multiFileReaderJob")
.start(multiFileReaderStep())
.build();
}
@Bean
public Step multiFileReaderStep() throws Exception {
return stepBuilderFactory.get("multiFileReaderStep")
.<Student, Student>chunk(5)
.reader(multiFileReader())
.processor(processor())
.writer(classMultiItemwriter())
.stream(xmlFileWriter())
.stream(flatFileWriter())
.build();
}
public CompositeItemProcessor<? super Student,? extends Student> processor() {
CompositeItemProcessor<Student,Student> processor = new CompositeItemProcessor<>();
List<ItemProcessor<Student,Student>> delegates = new ArrayList<>();
processor.setDelegates(delegates);
return processor;
}
@Bean
public MultiResourceItemReader<Student> multiFileReader() {
MultiResourceItemReader<Student> reader = new MultiResourceItemReader<>();
reader.setDelegate(flatFileReader());
reader.setResources(filesResources);
return reader;
}
@Bean
@StepScope
public FlatFileItemReader<Student> flatFileReader() {
log.info("读一次数据...");
FlatFileItemReader<Student> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("student.txt"));
reader.setLinesToSkip(1);
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames(new String[]{"id", "name", "age"});
DefaultLineMapper<Student> mapper = new DefaultLineMapper<>();
mapper.setLineTokenizer(tokenizer);
mapper.setFieldSetMapper(fieldSet -> {
Student stu = new Student();
stu.setId(fieldSet.readInt("id"));
stu.setName(fieldSet.readString("name"));
stu.setAge(fieldSet.readInt("age"));
return stu;
});
mapper.afterPropertiesSet();
reader.setLineMapper(mapper);
return reader;
}
@Bean
public CompositeItemWriter<? super Student> compositeItemWriter() throws Exception {
CompositeItemWriter<Student> writer = new CompositeItemWriter<>();
writer.setDelegates(Arrays.asList(flatFileWriter(), xmlFileWriter()));
writer.afterPropertiesSet();
return writer;
}
@Bean
public ClassifierCompositeItemWriter<Student> classMultiItemwriter() {
ClassifierCompositeItemWriter<Student> writer = new ClassifierCompositeItemWriter<>();
writer.setClassifier(new Classifier<Student, ItemWriter<? super Student>>() {
@Override
public ItemWriter<? super Student> classify(Student student) {
ItemWriter<Student> itemwriter = null;
try {
itemwriter = student.getId() % 2 == 0 ? flatFileWriter() : xmlFileWriter();
} catch (Exception e) {
e.printStackTrace();
}
return itemwriter;
}
});
return writer;
}
@Bean
public StaxEventItemWriter<Student> xmlFileWriter() throws Exception {
StaxEventItemWriter<Student> writer = new StaxEventItemWriter<>();
XStreamMarshaller marshaller = new XStreamMarshaller();
Map<String, Class> map = new HashMap<>();
map.put("student", Student.class);
writer.setRootTagName("students");
writer.setMarshaller(marshaller);
String path = "C:\\Users\\miles\\Desktop\\SpringBatch_demo\\src\\main\\resources\\ComXml.xml";
writer.setResource(new FileSystemResource(path));
writer.afterPropertiesSet();
return writer;
}
@Bean
public FlatFileItemWriter<Student> flatFileWriter() throws Exception {
FlatFileItemWriter<Student> writer = new FlatFileItemWriter<>();
String path = "C:\\Users\\miles\\Desktop\\SpringBatch_demo\\src\\main\\resources\\ComJson.txt";
writer.setResource(new FileSystemResource(path));
writer.setLineAggregator(new LineAggregator<Student>() {
final ObjectMapper mapper = new ObjectMapper();
@Override
public String aggregate(Student item) {
String str = null;
try {
str = mapper.writeValueAsString(item);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return str;
}
});
writer.afterPropertiesSet();
return writer;
}
}
xml文件读写数据
private StaxEventItemReader<? extends Student> xmlFileReader() {
log.info("进入xmlFileReader...");
StaxEventItemReader reader = new StaxEventItemReader();
reader.setResource(new ClassPathResource("student.xml"));
reader.setFragmentRootElementName("student");
XStreamMarshaller unmarshaller = new XStreamMarshaller();
Map<String, Class> map = new HashMap<>();
map.put("student", Student.class);
unmarshaller.setAliases(map);
reader.setUnmarshaller(unmarshaller);
return reader;
}
private StaxEventItemWriter<? super Student> xmlFileWriter() throws Exception {
StaxEventItemWriter<Student> writer = new StaxEventItemWriter();
XStreamMarshaller marshaller = new XStreamMarshaller();
Map<String, Class> map = new HashMap<>();
map.put("student", Student.class);
writer.setRootTagName("students");
writer.setMarshaller(marshaller);
String path = "C:\\Users\\miles\\Desktop\\SpringBatch_demo\\src\\main\\resources\\XmlFileWriter.xml";
writer.setResource(new FileSystemResource(path));
writer.afterPropertiesSet();
return writer;
}