当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

ItemReader

虽然概念很简单,但 ItemReader 是一种可以从多种不同输入源提供数据的机制。最常见的例子包括:

  • 平面文件:平面文件 item reader 从平面文件中逐行读取数据。文件中的记录通常要么通过固定位置来定义字段,要么通过某种特殊分隔符(例如逗号)来划分字段。

  • XML:XML ItemReader 可以处理 XML,而不依赖于具体使用哪种解析、映射和对象校验技术。输入数据还支持基于 XSD 模式对 XML 文件进行校验。

  • 数据库:访问数据库资源以返回结果集,再把结果集映射为可供处理的对象。默认的 SQL ItemReader 实现会调用 RowMapper 来返回对象;如果需要重启,还会跟踪当前行位置、保存基础统计信息,并提供一些后面会介绍的事务增强能力。

当然还有更多可能性,但本章只聚焦于基础类型。所有可用的 ItemReader 实现完整清单可参见 附录 A

ItemReader 是一个用于通用输入操作的基础接口,其定义如下:

public interface ItemReader<T> {

    T read() throws Exception;

}

read 方法定义了 ItemReader 最核心的契约。调用它时,会返回一个 item;如果已经没有更多 item,则返回 null。 一个 item 可以表示文件中的一行、数据库中的一行记录,或者 XML 文件中的一个元素。通常期望这些内容会被映射成可用的领域对象 (例如 TradeFoo 等),但接口契约本身并不强制要求这样做。

通常期望 ItemReader 的实现是只向前读取的。不过,如果底层资源具备事务特性(例如 JMS 队列),那么在发生回滚时, 后续再次调用 read 时,可能会返回同一个逻辑 item。还需要注意的是,ItemReader 没有可处理数据时不会抛出异常。 例如,一个数据库 ItemReader 如果配置的查询返回 0 条结果,那么第一次调用 read 时就会返回 null