0
Help us understand the problem. What are the problem?

posted at

SpringBatchのItemReaderでDBデータを取得する方法(MyBatis)

SpringBatchのChunkモデルを使う場合、データベースからデータを取得し、chunkサイズごとにデータを処理する方法を紹介しようと思います。

サンプルソース

Configuration.java
  @Autowired
  SqlSessionFactory sqlSessionFactory;

  @Bean
  public Step chunk() {
    return stepBuilderFactory.get("chunk").<DemoDto, DemoDto> chunk(100)
        .reader(this.myBatisReader())
        .processor(this.Processor)
        .writer(this.Writer)
        .build();
  }
  
  // MyBatisPagingItemReaderを使ってデータをページ分けて取得
  @Bean
  public MyBatisPagingItemReader<DemoDto> myBatisReader() throws IOException {
    // 検索条件の項目名と値をマップに格納
    Map<String, Object> params = new HashMap<>(); 
    params.put("id", 1);
    return new MyBatisPagingItemReaderBuilder<DemoDto>()
        .sqlSessionFactory(this.sqlSessionFactory) // sqlSessionFactoryは一般的にそのままでいい
        // queryIdは下記Mapperのnamespace+select id
        .queryId("com.example.demo.dao.demoDao.select")
        .parameterValues(params) 
        .pageSize(100) // chunkサイズと合わせる
        .build();
  }
DemoMapper.xml
<mapper namespace="com.example.demo.dao.DemoDao">
  <select id="select" resultMap="BaseResultMap">
	select id, name
	from demo 
    where id = #{id,jdbcType=INTEGER}
    <? limitは必ず記載すること、_pagesizeは上記MyBatisPagingItemReaderBuilderで設置する ?> 
 	limit #{_skiprows}, #{_pagesize}
  </select>
</mapper>

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?