ItemReaderについて説明します。
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> |
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> |
ポイント
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> |
ポイント
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> |
ポイント
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();
} |