ページの先頭行へ戻る
Interstage Business Application Server オープンJavaフレームワークユーザーズガイド Java EE 7編
FUJITSU Software

4.7.5 ItemReader

ItemReaderについて説明します。

4.7.5.1 対応形式

ItemReaderの対応形式は以下のとおりです。

ポイント

データベースの接続設定については、“4.5 各起動方法におけるデータベースの接続設定”を参照してください。

4.7.5.2 csvファイルを使用する場合

csvファイルはSpring Batchアプリケーションを実行するサーバに配置してください。

例1はcsvファイルの内容を直接渡す場合の例です。例2はcsvファイルの内容を指定して読み込む場合の例です。ItemReaderの設定とは別にPOJOクラスとFieldSetMapperクラスが必要です。指定した形式とは異なるデータが含まれていた場合、エラーを返します。例3は複数のCSVファイルを使用する場合の例です。

1 csvファイルの内容を直接後プロセスに渡す場合

Job定義ファイル(job.xml):

<!-- ItemReader定義 -->
<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="file:/csv/input.csv" />
    <!-- lineMapperを行わないための設定 -->
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.PassThroughLineMapper" />
    </property>
</bean>

例2 csvファイルの内容を指定して読み込む場合

POJOクラス(UserModel.java):

public class UserModel {
    private int id;
    private String name;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

FieldSetMapperクラス(UserFieldSetMapper.java):

public class UserFieldSetMapper implements FieldSetMapper<UserModel> {
    public UserModel mapFieldSet(FieldSet fieldSet) {
        UserModel userModel = new UserModel();
        userModel.setId(fieldSet.readInt("id"));
        userModel.setName(fieldSet.readString("name"));
        return userModel;
    }
}

Job定義ファイル(job.xml):

<!-- ItemReader定義 -->
<bean id="flatFileItemReader " class="org.springframework.batch.item.file.FlatFileItemReader">
    <property name="resource" value="file:/csv/input.csv" />
    <!-- lineMapperの設定 -->
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
            <!-- 想定するトークンを指定 -->
            <property name="lineTokenizer">
                <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                    <property name="names" value="id, name" />
                </bean>
            </property>
            <!-- FieldSetMapperの指定 -->
            <property name="fieldSetMapper">
                <bean class="example.UserFieldSetMapper" />
            </property>
        </bean>
    </property>
</bean>

3 複数のCSVファイルを使用する場合

Job定義ファイル(job.xml):

<!-- MultiResourceItemReader定義 -->
<bean id="multiResourceItemReader" class="org.springframework.batch.item.file.MultiResourceItemReader">
    <!-- 正規表現を使用して複数ファイルを取得 -->
    <property name="resources" value="file:/csv/input*.csv" />
    <!-- デリゲートするFileItemReaderの指定 -->
    <property name="delegate" ref="flatFileItemReader" />
</bean>
<!-- ItemReader定義 -->
<bean id="flatFileItemReader" class="org.springframework.batch.item.file.FlatFileItemReader">
    <!-- MultiResourceItemReaderにてresource定義を行うため、resource定義は不要 -->
    <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.PassThroughLineMapper" />
    </property>
</bean>

4.7.5.3 データベースを使用する場合(JDBC)

JDBCを使用したデータベース入力についての設定を以下に示します。

Job定義ファイル(job.xml):

<!-- ItemReader定義 -->
<bean id="jdbcPagingItemReader" class="org.springframework.batch.item.database.JdbcPagingItemReader">
    <!-- 入力データが格納されているデータソースを設定 -->
    <property name="dataSource" ref="jdbcDataSource" />
    <!-- 各種DB用のクエリ生成機能設定 -->
    <property name="queryProvider">
        <bean class="org.springframework.batch.item.database.support.OraclePagingQueryProvider">
            <property name="selectClause" value="select *" />
            <property name="fromClause" value=" USERTABLE" />
            <property name="sortKeys">
                <map>
                    <entry key="id" value="ASCENDING" />
                </map>
            </property>
        </bean>
    </property>
    <!-- Mapper用クラスを設定 -->
    <property name="rowMapper">
        <bean class="org.springframework.jdbc.core.BeanPropertyRowMapper">
            <property name="mappedClass" value="example.model.UserModel" />
        </bean>
    </property>
</bean>

4.7.5.4 データベースを使用する場合(Hibernate)

ポイント

Hibernateの設定方法については、“オープンJavaフレームワークユーザーズガイド Java EE 7編”の“3.3.3.4 O/Rマッピング連携(Hibernate)”を参照してください。

Hibernateを使用したデータベース入力についての設定を示します。

Job定義ファイル(job.xml):

<!-- ItemReader定義 -->
<bean id=" hibernatePagingItemReader" class="org.springframework.batch.item.database.HibernatePagingItemReader">
    <!-- 入力データが格納されているデータソースを設定 -->
    <property name="dataSource" ref="hibernateDataSource" />
    <!-- セッションファクトリを設定 -->
    <property name="sessionFactory" ref="sessionFactory" />
    <!-- Hibernate Query Language(HQL)のfrom句にてエンティティクラスを指定 -->
    <property name="queryString" value="from example.model.UserModel" />
</bean>

4.7.5.5 データベースを使用する場合(JPA)

ポイント

JPAの設定方法については、“オープンJavaフレームワークユーザーズガイド Java EE 7編”の“3.3.3.5 O/Rマッピング連携(JPA)”を参照してください。

JPAを使用したデータベース入力についての設定を示します。

Job定義ファイル(job.xml):

<!-- ItemReader定義 -->
<bean id="jpaPagingItemReader" class="org.springframework.batch.item.database.JpaPagingItemReader">
    <!-- 入力データが格納されているデータソースを設定 -->
    <property name="dataSource" ref="jpaDataSource" />
    <!-- エンティティマネージャファクトリを指定 -->
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <!-- Java Persistence Query Language(JPQL)のfrom句にてエンティティクラスを指定 -->
    <property name="queryString" value="from example.model.UserModel" />
</bean>

4.7.5.6 データベースを使用する場合(MyBatis)

ポイント

MyBatisの設定方法については、“オープンJavaフレームワークユーザーズガイド Java EE 7編”の“3.3.3.6 O/Rマッピング連携(MyBatis)”を参照してください。

MyBatisを使用したデータベース入力についての設定を示します。

Job定義ファイル(job.xml):

<!-- Mapperインターフェースを指定 -->
<mybatis-spring:scan base-package="example.mapper" />
<!-- ItemReader定義 -->
<bean id="mybatisPagingItemReader" class="org.mybatis.spring.batch.MyBatisPagingItemReader">
    <!-- 入力データが格納されているデータソースを設定 -->
    <property name="dataSource" ref="mybatisDataSource" />
    <!-- セッションファクトリを設定 -->
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    <!-- 入力用メソッドを指定 -->
    <property name="queryId" value="example.mapper.SQLMapper.getUser" />
</bean>

MyBatisPagingItemReaderを使用する場合は、読み込んだページ番号をわたす必要があります。読み込んだページ番号をわたすSQL文はデータベースによって異なります。以下に例を示します。

Symfoware Server (Postgres)の場合(SQLMapper.java):

// Mapperインターフェース
public interface SQLMapper {
    // Symfoware Server (Postgres)用のSQL文
    @Select("SELECT id, name FROM TESTTABLE ORDER BY id ASC LIMIT #{_pagesize} OFFSET #{_skiprows}")
    UserModel getUser();
}

Oracleの場合(SQLMapper.java):

// Mapperインターフェース
public interface SQLMapper {
    // Oracle用のSQL文
    @Select("select * from (select * from (SELECT id, name, ROWNUM ROWNUM_ FROM TESTTABLE T ORDER BY id) WHERE ROWNUM_ > ( #{_page} * #{_pagesize} )) WHERE ROWNUM <= #{_pagesize}")
    UserModel getUser();
}