MyBatisPagingItemReader/MyBatisCursorItemReader/MyBatisBatchItemWriterの実装サンプル

# はじめに
前回はJDBC系のItemReader/ItemWriterについてまとめましたが、今回は、MyBatis系のMyBatisPagingItemReader/MyBatisCursorItemReader/MyBatisBatchItemWriterの実装例をまとめてました。Spring Bacthのバージョンは4.0.1で、MyBatis-Springのバージョンは1.3.1です。
前回の記事は[こちら](https://qiita.com/yuuman/items/9c28b8af0e2b08ad200c)。

# サンプルAPの仕様
サンプルAPの仕様は以前JDBC系のItemReader/ItemWriterについてまとめた時と同じです。
詳細は[以前の記事](https://qiita.com/yuuman/items/9c28b8af0e2b08ad200c#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%ABap%E3%81%AE%E4%BB%95%E6%A7%98)を参照してください。

# 実装サンプル
## MyBatisPagingItemReader
```java:
@Autowired
public DataSource dataSource;

@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
    SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
    sessionFactory.setDataSource(dataSource);
    return (SqlSessionFactory) sessionFactory.getObject();
}

@Bean
public ItemReader myBatisPagingItemReader(SqlSessionFactory sqlSessionFactory) {
    MyBatisPagingItemReader reader = new MyBatisPagingItemReader();
    Map<String, Object> parameterValues = new HashMap<String, Object>();
    parameterValues.put("status","A");
    reader.setPageSize(1000);
    reader.setSqlSessionFactory(sqlSessionFactory);
    reader.setParameterValues(parameterValues);
    reader.setQueryId("dbaccess.mybatis.SampleMapper.selectStatusAbyPage");
    return reader;
}
```
```xml:
<mapper namespace="dbaccess.mybatis.SampleMapper">

    <select id="selectStatusAbyPage" resultType="common.dto.Sample">
        SELECT
            id AS id,
            parameter1 AS parameter1,
            parameter2 AS parameter2,
            status AS status,
            last_update_timestamp AS lastUpdateTimestamp
        FROM
            sample
        WHERE
            status = #{status}
        LIMIT
            #{_skiprows},
            #{_pagesize}
    </select>
 
    //省略

</mapper>
```


## MyBatisCursorItemReader
```java:

//SqlSessionFactoryBean、DataSourceの実装は省略

@Bean
public ItemReader myBatisCursorItemReader(SqlSessionFactory sqlSessionFactory) {
    MyBatisCursorItemReader reader = new MyBatisCursorItemReader();
    Map<String, Object> parameterValues = new HashMap<String, Object>();
    parameterValues.put("status","A");
    reader.setSqlSessionFactory(sqlSessionFactory);
    reader.setParameterValues(parameterValues);
    reader.setQueryId("dbaccess.mybatis.SampleMapper.selectStatusAbyCursor");
    return reader;
}
```
```xml:
<mapper namespace="dbaccess.mybatis.SampleMapper">

    //省略

    <select id="selectStatusAbyCursor" resultType="common.dto.Sample">
        SELECT
            id AS id,
            parameter1 AS parameter1,
            parameter2 AS parameter2,
            status AS status,
            last_update_timestamp AS lastUpdateTimestamp
        FROM
            sample
        WHERE
            status = #{status}
    </select>

    //省略

</mapper>
```


## MyBatisBatchItemWriter
```java:

//SqlSessionFactoryBean、DataSourceの実装は省略

@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
    return new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);
}

@Bean
public ItemWriter myBatisBatchItemWriter(SqlSessionTemplate sqlSessionTemplate) {
    MyBatisBatchItemWriter writer = new MyBatisBatchItemWriter();
    writer.setSqlSessionTemplate(sqlSessionTemplate);
    writer.setStatementId("dbaccess.mybatis.SampleMapper.insertSampleDataToSampleSub");   
    return writer;
}
```
```xml:
<mapper namespace="dbaccess.mybatis.SampleMapper">
　　
    //省略
    
    <insert id="insertSampleDataToSampleSub" parameterType="common.dto.Sample">
        INSERT INTO sample_sub (
            id,
            parameter1,
            parameter2,
            status,
            last_update_timestamp
        ) VALUES (
            #{id},
            #{parameter1},
            #{parameter2},
            #{status},
            #{lastUpdateTimestamp}
        )
    </insert>
</mapper>
```