SpringBatch从入门到实战(八):ItemWriter

文章详细介绍了在SpringBatch框架中如何使用FlatFileItemWriter写自定义格式和JSON字符串,以及利用JsonFileItemWriter处理JSON数据。同时,文章提到了XML输出的实现,并展示了JdbcBatchItemWriter用于数据库批量插入的方式,包括MyBatis的集成。最后,文章讨论了CompositeItemWriter和ClassifierCompositeItemWriter用于组合和分类数据写入的高级用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一: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();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值