Spring-Batch
におけるMyBatisPagingItemReader
の実装方法に関して、ググッても全く出てこなかったので仕方なくライブラリのソースを読みつつ実装したので以下に残す。
@Autowired
SqlSessionFactory sqlSessionFactory;
@Bean
public MyBatisPagingItemReader<SampleDto> reader() {
MyBatisPagingItemReader<SampleDto> reader = new MyBatisPagingItemReader<SampleDto>();
Map<String, Object> parameterValues = new HashMap<String, Object>();
parameterValues.put("param1", "sample");
reader.setQueryId("XXX.AAA.SampleQuery");
reader.setPageSize(10000);
reader.setParameterValues(parameterValues);
reader.setSqlSessionFactory(sqlSessionFactory);
return reader;
}
はまったのは、以下の3点。
①setQueryId()
に指定するクエリIDは、mybatis-config.xml
の<mappers>
に<mapper>
タグで設定されたすべてのXMLファイルの中で一意のIDのものを指定する、またはフルパス指定する。
②SqlSessionFactory
を設定しないと(確か)IllegalArgumentExceptionが発生する
③クエリの書き方
①は、各XMLファイルの先頭に<resultMap id="BaseResultMap" type="XXX.AAA" >
とあり、対象クエリが<select id="SampleQuery" resultMap="BaseResultMap" parameterType="XXX.AAA.SampleExample" >
というタグで宣言されている場合の例。SampleQuery
が全XMLの中で一意であればXXX.AAA.
は省略出来る。
②は、インターフェースであるSqlSessionFactory
を@Autowired
すれば、自動的にデフォルトのインスタンスが設定されるのでそれをsetSqlSessionFactory()
にて設定する。
③SELECT id, name, job FROM employees ORDER BY id ASC LIMIT #{_skiprows}, #{_pagesize}
のように、LIMIT #{_skiprows}, #{_pagesize}
が必須。
以下参考
http://www.mybatis.org/spring/ja/batch.html