一:FlatFileItemWriter
1.1 写自定义格式字符串
@Bean
public FlatFileItemWriter<User> itemWriter(){
return new FlatFileItemWriterBuilder<User>()
.name("userItemWriter")
.resource(new PathResource("c:/outUser.txt")) //输出的文件
.formatted() //数据格式指定
.format("id: %s,姓名:%s,年龄:%s") //输出数据格式
.names("id", "name", "age") //需要输出属性
.shouldDeleteIfEmpty(true) //如果读入数据为空,输出时创建文件直接删除
.shouldDeleteIfExists(true) //如果输出文件已经存在,则删除
.append(true) //如果输出文件已经存在, 不删除,直接追加到现有文件中
.build();
}
1.2 写json字符串
@Bean
public FlatFileItemWriter<UserInfo> flatFileItemWriter(){
return new FlatFileItemWriterBuilder<UserInfo>()
.name("userItemWriter")
.resource(new PathResource("/Users/xxx/User.txt")) //输出的文件
.lineAggregator(new LineAggregator<UserInfo>() {
ObjectMapper objectMapper = new ObjectMapper();
@Override
public String aggregate(UserInfo user) {
String string = null;
try {
string = objectMapper.writeValueAsString(user);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return string;
}
})
.shouldDeleteIfEmpty(true) //如果读入数据为空,输出时创建文件直接删除
.shouldDeleteIfExists(true) //如果输出文件已经存在,则删除
.append(true) //如果输出文件已经存在, 不删除,直接追加到现有文件中
.build();
}
二:JsonFileItemWriter
Spring Batch默认提供装配器有2个:JacksonJsonObjectMarshaller 和 GsonJsonObjectMarshaller 分别对应Jackson 跟 Gson 2种json格式解析逻辑。
@Bean
public JacksonJsonObjectMarshaller<User> objectMarshaller(){
JacksonJsonObjectMarshaller marshaller = new JacksonJsonObjectMarshaller();
return marshaller;
}
@Bean
public JsonFileItemWriter<User> itemWriter(){
return new JsonFileItemWriterBuilder<User>()
.name("jsonUserItemWriter")
.resource(new PathResource("c:/outUser.json"))
.jsonObjectMarshaller(objectMarshaller())
.build();
}
三:XML
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.7</version>
</dependency>
@Bean
public StaxEventItemWriter<UserInfo> xmlItemWriter() {
Map<String, Class> map = new HashMap<>();
map.put("user", UserInfo.class);
XStreamMarshaller marshaller = new XStreamMarshaller();
marshaller.setAliases(map);
return new StaxEventItemWriterBuilder<UserInfo>()
.name("xmlItemWriter")
.rootTagName("users")
.resource(new FileSystemResource("/Users/xxx/users.xml"))
.marshaller(marshaller)
.build();
}
四:JdbcBatchItemWriter
@Autowired
private DataSource dataSource;
@Bean
public UserPreStatementSetter preStatementSetter(){
return new UserPreStatementSetter();
}
@Bean
public JdbcBatchItemWriter<User> itemWriter(){
return new JdbcBatchItemWriterBuilder<User>()
.dataSource(dataSource)
.sql("insert into user(id, name, age) values(?,?,?)")
.itemPreparedStatementSetter(preStatementSetter())
.build();
}
@Bean
public JdbcBatchItemWriter<User> itemWriter(){
// BeanPropertyItemSqlParameterSourceProvider 会根据属性名自动填充参数
return new JdbcBatchItemWriterBuilder<User>()
.dataSource(dataSource)
.sql("insert into user(id, name, age) values(:id, :name, :age)")
.itemPreparedStatementSetter(new BeanPropertyItemSqlParameterSourceProvider<User>())
.build();
}
//写入数据库需要操作insert sql, 使用预编译就需要明确指定参数值
public class UserPreStatementSetter implements ItemPreparedStatementSetter<User> {
@Override
public void setValues(User item, PreparedStatement ps) throws SQLException {
ps.setLong(1, item.getId());
ps.setString(2, item.getName());
ps.setInt(3, item.getAge());
}
}
五:MyBatisBatchItemWriter
@Bean
public MyBatisBatchItemWriter<User> itemWriter(){
MyBatisBatchItemWriter<User> itemWriter = new MyBatisBatchItemWriter<>();
itemWriter.setSqlSessionFactory(sqlSessionFactory);
itemWriter.setStatementId("com.example.batch.mapper.UserMapper.insertUser"); //操作sql
return itemWriter;
}
六:CompositeItemWriter和ClassifierCompositeItemWriter
@Bean
public CompositeItemWriter<User> compositeItemWriter(){
return new CompositeItemWriterBuilder<User>()
.delegates(Arrays.asList(flatFileItemWriter(), jsonFileItemWriter(), jdbcBatchItemWriter()))
.build();
}
@Bean
public ClassifierCompositeItemWriter<UserInfo> classifierCompositeItemWriter() {
return new ClassifierCompositeItemWriterBuilder<UserInfo>()
.classifier(new Classifier<UserInfo, ItemWriter<? super UserInfo>>() {
@Override
public ItemWriter<? super UserInfo> classify(UserInfo userInfo) {
// 对数据进行分类,写到不同的writer
return userInfo.getId() % 2 == 0 ? flatFileItemWriter() : xmlItemWriter();
}
})
.build();
}