继杨小强童鞋的《Spring Batch入门篇》之后,继续为大家分享第二篇关于Spring Batch的系列教程。
更多内容请持续关注:spring4all.com,更多spring技术干货与交流学习期待您的参与!
Spring Batch:文件的批量读写Flatfile(XML,CSV,TXT)
⏩ 该系列课程中的示例代码使用springBatch 版本为3.0.7;讲解可能会讲一些4.0.X的特性
示例代码地址:https://git.oschina.net/huicode/springbatch-learn
在这里说到FlatFile的时候,其实XML,CSV,TXT三种文件格式中XML是不属于FlatFile 的,XML在Batch中是属于StaxEvent,但是本章主要讲述SpringBatch对于文件的读写,所以放到一起说明。
本文主要讲解通过SpringBatch来处理文本格式的文件,在实际的业务中也许文本文件转DB data或者DB data转文本文件的情形更多。
说明:在spring官方文档中的说明都是基于xml配置的方式来实现ItemReader、ItemWriter、Job、Step的配置的,为了符合springBoot的配置方式,示例代码都是配置代码实现的。
使用springBatch对于 xml 文件进行读写 操作时需要引入spring-oxm 包
pom.xml配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>4.3.8.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
项目结构说明
为了更好的管理代码,根据类对应的职责创建了不同的包:
文件读写
使用
FlatFileItemReader,FlatFileItemWriter
帮我们做了什么?
2. 对文件读写时能够保证事物
详解 FlatFileItemReader
FlatFileItemReader 是对文件读取的类,一般是对表格数据,或者文本文件数据的处理。该类的以下两个属性是必须要set的
@Bean
public FlatFileItemReader<Person>csvItemReader() {
FlatFileItemReader<Person> csvItemReader = new FlatFileItemReader<>();
csvItemReader.setResource(new ClassPathResource("data/sample-data.csv"));
csvItemReader.setLineMapper(new DefaultLineMapper<Person>() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[]{"name", "age"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
setTargetType(Person.class);
}});
}});
return csvItemReader;
}
详解 FlatFileItemWriter
FlatFileItemWriter 是对文件的写入类,将批量数据流写入文件,该类使用必须了解下面几个方法的用法:
@Bean
public FlatFileItemWriter<Person> txtItemWriter() {
FlatFileItemWriter<Person> txtItemWriter = new FlatFileItemWriter<>();
txtItemWriter.setAppendAllowed(true);
txtItemWriter.setEncoding("UTF-8");
txtItemWriter.setResource(new ClassPathResource("/data/sample-data.txt"));
txtItemWriter.setLineAggregator(new DelimitedLineAggregator<Person>() {{
setDelimiter(",");
setFieldExtractor(new BeanWrapperFieldExtractor<Person>() {{
setNames(new String[]{"name", "age"});
}});
}});
return txtItemWriter;
}
XML文件处理
对xml文件的处理需要引入spring-oxm包,仅对xml的输出进行详解,XML读取类似 对xml写入操作的对象为StaxEventItemWriter,与FlatFileItemWriter的使用类似,StaxEventItemWriter 与 FlatFileItemWriter都有着setResource方法,StaxEventItemWriter默认编码为utf-8
自定义处理器ItemProcessor
ItemProcessor主要负责数据的转换与处理,将读取到的文件 转换为输出文件的对象,所以temProcessor这里不一定都是Person,实现process方法,实现数据的转换与处理。
public class PersonItemProcessor implements ItemProcessor<Person, Person> {
@Override
public Person process(Person person) throws Exception {
person.setAge(person.getAge() + 1);
person.setName(person.getName() + "-_-");
return person;
}
}
整个Job 的处理流程
推荐阅读