目录
Spring Batch 中的 Writer(写入器)是一个关键的组件,用于将处理过的数据写入目标存储,例如数据库、文件、消息队列等。
一、Spring Batch写入器
JdbcBatchItemWriter:用于将数据写入关系型数据库,如MySQL、Oracle等。它通常与Spring的JDBC模块一起使用。
@Bean
public JdbcBatchItemWriter<DataObject> jdbcWriter(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<DataObject>()
.dataSource(dataSource)
.sql("INSERT INTO your_table (column1, column2) VALUES (:value1, :value2)")
.beanMapped()
.build();
}
JpaItemWriter:用于将数据写入JPA(Java Persistence API)存储,如Hibernate。它可以将数据保存到关系型数据库中。
@Bean
public JpaItemWriter<DataObject> jpaWriter(EntityManagerFactory entityManagerFactory) {
JpaItemWriter<DataObject> writer = new JpaItemWriter<>();
writer.setEntityManagerFactory(entityManagerFactory);
return writer;
}
FlatFileItemWriter:用于将数据写入文本文件,例如CSV、XML等。你可以指定文件的格式和位置。
@Bean
public FlatFileItemWriter<DataObject> fileWriter() {
return new FlatFileItemWriterBuilder<DataObject>()
.name("fileWriter")
.resource(new FileSystemResource("output-data.csv"))
.delimited()
.delimiter(",")
.names(new String[]{"column1", "column2"})
.build();
}
CompositeItemWriter:允许你将数据同时写入多个目标,例如数据库和文件。
@Bean
public CompositeItemWriter<DataObject> compositeWriter(JdbcBatchItemWriter<DataObject> jdbcWriter, FlatFileItemWriter<DataObject> fileWriter) {
CompositeItemWriter<DataObject> writer = new CompositeItemWriter<>();
writer.setDelegates(Arrays.asList(jdbcWriter, fileWriter));
return writer;
}
Custom ItemWriter:你还可以自定义写入器,实现 ItemWriter
接口并编写自己的写入逻辑。
public class CustomItemWriter implements ItemWriter<DataObject> {
@Override
public void write(List<? extends DataObject> items) throws Exception {
// 自定义写入逻辑
}
}
二、FlatFileItemWriter详解
FlatFileItemWriter
是 Spring Batch 中用于将数据写入平面文件(Flat File)的写入器。平面文件通常是指简单的文本文件,例如 CSV 文件、XML 文件、JSON 文件等。FlatFileItemWriter
提供了许多配置选项,可以根据需要自定义文件的格式和位置。
FlatFileItemWriter
的一些常见配置和用法
1、基本配置:
@Bean
public FlatFileItemWriter<DataObject> flatFileWriter() {
return new FlatFileItemWriterBuilder<DataObject>()
.name("flatFileWriter")
.resource(new FileSystemResource("output-data.csv")) // 指定输出文件的路径
.delimited() // 使用分隔符格式
.delimiter(",") // 指定分隔符
.names(new String[]{"column1", "column2"}) // 指定列名
.fieldExtractor(new BeanWrapperFieldExtractor<DataObject>() {{
setNames(new String[]{"column1", "column2"}); // 指定数据对象的属性名
}})
.build();
}
在上述配置中,我们创建了一个 FlatFileItemWriter
,指定了输出文件的路径、使用逗号作为分隔符、指定列名以及如何从数据对象中提取数据。
2、其他配置选项:
.lineAggregator()
:可以设置如何将数据行转换为文本行,通常与FormatterLineAggregator
或自定义LineAggregator
配合使用。.headerCallback()
:可以设置文件头部的回调函数。.footerCallback()
:可以设置文件尾部的回调函数。.shouldDeleteIfExists()
:如果文件已经存在,是否应该删除并重新创建,默认为 false。.transactional()
:是否在事务内写入文件,默认为 true。.append()
:是否追加到已存在的文件,默认为 false。.encoding()
:指定文件的编码,默认为系统默认编码。
3、使用自定义 LineAggregator:
你可以实现自定义的 LineAggregator
接口来控制如何将数据对象转换为文本行。
public class CustomLineAggregator implements LineAggregator<DataObject> {
@Override
public String aggregate(DataObject dataObject) {
// 自定义逻辑,将 DataObject 转换为文本行
return dataObject.getColumn1() + "," + dataObject.getColumn2();
}
}
@Bean
public FlatFileItemWriter<DataObject> flatFileWriter() {
return new FlatFileItemWriterBuilder<DataObject>()
.name("flatFileWriter")
.resource(new FileSystemResource("output-data.csv"))
.lineAggregator(new CustomLineAggregator()) // 使用自定义 LineAggregator
.build();
}
FlatFileItemWriter
可以根据不同的需求和文件格式进行配置,从而将处理过的数据写入平面文件。