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 被對映到可用的領域物件(例如 TradeFoo 或其他),但契約中沒有強制要求這樣做。

ItemReader 介面的實現通常應是隻向前(forward only)的。然而,如果底層資源是事務性的(例如 JMS 佇列),那麼在回滾場景下,後續呼叫 read 可能會返回相同的邏輯 item。另外值得注意的是,ItemReader 沒有 item 可處理時不會丟擲異常。例如,配置的查詢返回 0 條結果的資料庫 ItemReader 在首次呼叫 read 時將返回 null