ItemReader
尽管概念简单,但 ItemReader
是从多种不同类型的输入中提供数据的方式。最常见的例子包括
-
平面文件:平面文件 Item Reader 从平面文件中读取数据行,这些文件通常通过文件中固定的位置或由特定字符(例如逗号)分隔的字段来描述记录。
-
XML:XML
ItemReaders
处理 XML,而无需依赖用于解析、映射和验证对象的技术。输入数据允许针对 XSD schema 验证 XML 文件。 -
数据库:访问数据库资源以返回结果集,这些结果集可以映射到对象进行处理。默认的 SQL
ItemReader
实现调用RowMapper
来返回对象,如果需要重启,则跟踪当前行,存储基本统计信息,并提供一些后面解释的事务增强功能。
还有很多其他可能性,但本章重点介绍基本类型。所有可用的 ItemReader
实现的完整列表可在 Appendix A 中找到。
ItemReader
是一个用于通用输入操作的基本接口,如下面的接口定义所示
public interface ItemReader<T> {
T read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException;
}
read
方法定义了 ItemReader
最基本的契约。调用它会返回一个 item,如果没有更多 item,则返回 null
。一个 item 可能代表文件中的一行、数据库中的一行或 XML 文件中的一个元素。通常期望这些 item 被映射到可用的领域对象(例如 Trade
、Foo
或其他),但契约中没有强制要求这样做。
ItemReader
接口的实现通常应是只向前(forward only)的。然而,如果底层资源是事务性的(例如 JMS 队列),那么在回滚场景下,后续调用 read
可能会返回相同的逻辑 item。另外值得注意的是,ItemReader
没有 item 可处理时不会抛出异常。例如,配置的查询返回 0 条结果的数据库 ItemReader
在首次调用 read
时将返回 null
。