ItemWriter
アイテムを読み出すための読み出しデータは、単位周期として読み出され、データライタを書き込むためのチャンクの単位、書き込みの部分に基づいている場合
例とItermReaderとして仕事を書きます
@Configuration
public class DbOutputDemoJobConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier("dbOutputDemoJobFlatFileReader")
public ItemReader<Customer> dbOutputDemoJobFlatFileReader;
@Autowired
@Qualifier("dbOutputDemoJobFlatFileWriter")
public ItemWriter<Customer> dbOutputDemoJobFlatFileWriter;
@Bean
public Step dbOutputDemoStep() {
return stepBuilderFactory.get("dbOutputDemoStep")
.<Customer,Customer>chunk(10)
.reader(dbOutputDemoJobFlatFileReader)
.writer(dbOutputDemoJobFlatFileWriter)
.build();
}
@Bean
public Job dbOutputDemoJob() {
return jobBuilderFactory.get("dbOutputDemoJob")
.start(dbOutputDemoStep())
.build();
}
}
@Configuration
public class DbOutputDemoJobReaderConfiguration {
@Bean
public FlatFileItemReader<Customer> dbOutputDemoJobFlatFileReader() {
FlatFileItemReader<Customer> reader = new FlatFileItemReader<>();
reader.setResource(new ClassPathResource("customerInit.csv"));
DefaultLineMapper<Customer> customerLineMapper = new DefaultLineMapper<>();
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames(new String[] {"id","firstName", "lastName", "birthdate"});
customerLineMapper.setLineTokenizer(tokenizer);
customerLineMapper.setFieldSetMapper((fieldSet -> {
return Customer.builder().id(fieldSet.readLong("id"))
.firstName(fieldSet.readString("firstName"))
.lastName(fieldSet.readString("lastName"))
.birthdate(fieldSet.readString("birthdate"))
.build();
}));
customerLineMapper.afterPropertiesSet();
reader.setLineMapper(customerLineMapper);
return reader;
}
}
データベースに書き込まれたデータ
テキストデータは倉庫保管します
データベーステーブル
JdbcBatchItemWriter
@Configuration
public class DbOutputDemoJobWriterConfiguration {
@Autowired
public DataSource dataSource;
@Bean
public JdbcBatchItemWriter<Customer> dbOutputDemoJobFlatFileWriter(){
JdbcBatchItemWriter<Customer> itemWriter = new JdbcBatchItemWriter<>();
// 设置数据源
itemWriter.setDataSource(dataSource);
// 执行sql语句
itemWriter.setSql("insert into customer(id,firstName,lastName,birthdate) values " +
"(:id,:firstName,:lastName,:birthdate)");
// 替换属性值
itemWriter.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>());
return itemWriter;
}
}
結果
データがファイルに書き込まれ.dataセクション
FlatFileItemWriter任意のタイプは、ターゲット・データ・Tのための共通のファイルに書き込むことができます
私たちは、customerInit.csvデータを読み出してcustomerInfo.data内のファイルに書き込まれます
FlatFileItemWriter
@Configuration
public class FlatFileDemoJobWriterConfiguration {
@Bean
public FlatFileItemWriter<Customer> flatFileDemoFlatFileWriter() throws Exception {
FlatFileItemWriter<Customer> itemWriter = new FlatFileItemWriter<>();
// 输出文件路径
String path = File.createTempFile("customerInfo",".data").getAbsolutePath();
System.out.println(">> file is created in: " + path);
itemWriter.setResource(new FileSystemResource(path));
// 将Customer对象转为字符串
itemWriter.setLineAggregator(new MyCustomerLineAggregator());
itemWriter.afterPropertiesSet();
return itemWriter;
}
}
public class MyCustomerLineAggregator implements LineAggregator<Customer> {
//JSON
private ObjectMapper mapper = new ObjectMapper();
@Override
public String aggregate(Customer customer) {
try {
return mapper.writeValueAsString(customer);
} catch (JsonProcessingException e) {
throw new RuntimeException("Unable to serialize.",e);
}
}
}
データはXMLファイルに書き込まれます
xmlファイルへの書き込みデータは、あなたがStaxEventItemWriterを使用する必要があり、シーケンスに使用されるXStreamMarshallerをファイル
StaxEventItemWriter
@Configuration
public class XMLFileDemoJobWriterConfiguration {
@Bean
public StaxEventItemWriter<Customer> xmlFileDemoXMLFileWriter() throws Exception {
// 对象转为XML
XStreamMarshaller marshaller = new XStreamMarshaller();
Map<String,Class> aliases = new HashMap<>();
aliases.put("customer",Customer.class);
marshaller.setAliases(aliases);
StaxEventItemWriter<Customer> itemWriter = new StaxEventItemWriter<>();
// 指定根标签
itemWriter.setRootTagName("customers");
itemWriter.setMarshaller(marshaller);
// 指定输出xml文件路径
String path = File.createTempFile("customerInfo",".xml").getAbsolutePath();
System.out.println(">> xml file is generated: " + path);
itemWriter.setResource(new FileSystemResource(path));
itemWriter.afterPropertiesSet();
return itemWriter;
}
}
出力は以下の
データが複数のファイルに書き込まれます
複数のファイル、使用または使用ClassifierCompositItemWriter CompositItemWriterにデータを書き込みます
それらの間の違い:
-
CompositeItemWriterを複数のファイルに書き込まれるデータの総量です。
-
ClassifierCompositeItemWriterルールは、指定されたファイルへのデータの条件を指定しています。
データはでCompositeItemWriter、ClassifierCompositeItemWriterに実装されたファイルを書き込み、xmlファイルとJSONファイルに書き込まれます
@Bean
public StaxEventItemWriter<Customer> xmlFileWriter() throws Exception {
// 对象转为XML
XStreamMarshaller marshaller = new XStreamMarshaller();
Map<String,Class> aliases = new HashMap<>();
aliases.put("customer",Customer.class);
marshaller.setAliases(aliases);
StaxEventItemWriter<Customer> itemWriter = new StaxEventItemWriter<>();
// 指定根标签
itemWriter.setRootTagName("customers");
itemWriter.setMarshaller(marshaller);
// 指定输出路径
String path = File.createTempFile("multiInfo",".xml").getAbsolutePath();
System.out.println(">> xml file is created in: " + path);
itemWriter.setResource(new FileSystemResource(path));
itemWriter.afterPropertiesSet();
return itemWriter;
}
@Bean
public FlatFileItemWriter<Customer> jsonFileWriter() throws Exception {
FlatFileItemWriter<Customer> itemWriter = new FlatFileItemWriter<>();
// 指定输出路径
String path = File.createTempFile("multiInfo",".json").getAbsolutePath();
System.out.println(">> json file is created in: " + path);
itemWriter.setResource(new FileSystemResource(path));
itemWriter.setLineAggregator(new MyCustomerLineAggregator());
itemWriter.afterPropertiesSet();
return itemWriter;
}
CompositeItemWriter
使用CompositeItemWriterファイルの複数の出力データは、 `` `@Bean公衆CompositeItemWriter customerCompositeItemWriterは( )例外{CompositeItemWriter itemWriter =新しいCompositeItemWriterを<>()スロー; // 出力の指定された複数itemWriter.setDelegates(は、Arrays.asList(xmlFileWriterオブジェクト()、 jsonFileWriter())); itemWriter.afterPropertiesSet( );戻りitemWriter;} `
出力
ClassifierCompositeItemWriter
ClassifierCompositeItemWriterは、ルールファイルに従ってデータを出力するために使用しました
@Bean
public ClassifierCompositeItemWriter<Customer> customerCompositeItemWriter() throws Exception {
ClassifierCompositeItemWriter<Customer> itemWriter = new ClassifierCompositeItemWriter<>();
itemWriter.setClassifier(new MyCustomerClassifier(xmlFileWriter(),jsonFileWriter()));
return itemWriter;
}
部門のルールは、ID、顧客 `` `パブリッククラスMyCustomerClassifier実装分類子に従って分類、データ構造を指定しました
}
<br/>
输出结果
![file](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9ncmFwaC5iYWlkdS5jb20vcmVzb3VyY2UvMjIyMDMwYmUzN2U5OWM2MzAwNTgzMDE1ODMzMzMyMzIucG5n?x-oss-process=image/format,png)
<br/>
![file](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9ncmFwaC5iYWlkdS5jb20vcmVzb3VyY2UvMjIyZjAwNWRiNjVmNjcwNmVkMWEwMDE1ODMzMzMzMTcucG5n?x-oss-process=image/format,png)
<br/>
<br/>
参考:
https://blog.csdn.net/wuzhiwei549/article/details/88593942
https://blog.51cto.com/13501268/2298822