上一篇中我们基本完成了从数据库到文件的读写,但是上一篇的处理上面是返回字符串,这样在我们的处理过程会变的很简单,但是当我们如果处理程序返回的不是一个String类型的字符串,而是一个entity类型呢?那么在我们的writer的处理时候就会边的不一样了。

现在我们就来看看他们之间的区别。

我们如果对于Spring batch稍微有点了解的,都应该知道,写文件是通过FlatFileItemWriter类的对象完成的,要完成写操作,首先,我们需要提供一个resources给writer对象,告诉它文件往哪里写,另外,还需要通过DelimitedLineAggregator的对象来对我们处理过的信息进行相关的再处理,但他在处理信息的时候,需要我们提供一个Delimiter,也就是告诉他,如何将信息进行划分成一个一个的字段。如果我们从process返回来的是一个String类型,那么我们就不需要再做其他事情了,但是如果是返回来一个entity的话,我们还要告诉DelimitedLineAggregator对象,如何将我们返回来的entity与我们现有的对象类的每个字段相匹配。这样也就需要我们给DelimitedLineAggregator对象提供BeanWrapperFieldExtractor对象,这个对象里面就是用来帮助我们将返回来的entity与我们给定的names进行相关的匹配。所以,在这之前我们还需要给BeanWrapperFieldExtractor对象设置FieldExtractor,传给他一个names数组。

具体代码如下:

 1  @Bean
 2     public ItemWriter<User> writer() throws IOException {
 3         FlatFileItemWriter<String> writer = new FlatFileItemWriter<User>();
 4         writer.setResource(new PathResource("test.csv"));
 5         DelimitedLineAggregator<User> delimitedLineAggregator = new DelimitedLineAggregator<User>();
 6         delimitedLineAggregator.setDelimiter(",");
 7         String[] names = {"userId","userName","address","birth","gender"};
 8         BeanWrapperFieldExtractor<User> beanWrapperFieldExtractor = new BeanWrapperFieldExtractor<User>();
 9         beanWrapperFieldExtractor.setNames(names);
10         delimitedLineAggregator.setFieldExtractor(beanWrapperFieldExtractor);
11         writer.setLineAggregator(delimitedLineAggregator);
12         return writer;
13     }