前提・実現したいこと
Spring Batch(Macchinetta Batch Framework)でデータベースアクセスをしてデータ入出力を行うジョブを、Mapperインタフェースを用いて作成したい。
【使用した教材】
・タスクレットモデルでの実装
https://macchinetta.github.io/batch-guideline/current/ja/Ch09_DBAccessJob.html#Ch09_Impl_DBAccessJob
発生している問題・エラーメッセージ
実行してもDBに値が反映されない。
該当のソースコード
■PointAddTasklet.java
package com.example.batch.tutorial.dbaccess.tasklet; import javax.inject.Inject; import org.apache.ibatis.cursor.Cursor; import org.springframework.batch.core.StepContribution;. import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; //import org.springframework.batch.item.ItemStreamReader; //import org.springframework.batch.item.ItemWriter; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.stereotype.Component; import com.example.batch.tutorial.common.dto.MemberInfoDto; import com.example.batch.tutorial.common.repository.MemberInfoRepository; @Component public class PointAddTasklet implements Tasklet { private static final String TARGET_STATUS = "1"; private static final String INITIAL_STATUS = "0"; private static final String GOLD_MEMBER = "G"; private static final String NORMAL_MEMBER = "N"; private static final int MAX_POINT = 1000000; @Inject MemberInfoRepository repository; @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { try(Cursor<MemberInfoDto> reader = repository.cursor()){ for(MemberInfoDto readRec : reader) { MemberInfoDto item = new MemberInfoDto(); if (TARGET_STATUS.equals(readRec.getStatus())) { if (GOLD_MEMBER.equals(readRec.getType())) { item.setPoint(readRec.getPoint() + 100); } else if (NORMAL_MEMBER.equals(readRec.getType())) { item.setPoint(readRec.getPoint() + 10); } if (readRec.getPoint() > MAX_POINT) { item.setPoint(MAX_POINT); } item.setStatus(INITIAL_STATUS); } repository.updatePointAndStatus(item); } } return RepeatStatus.FINISHED; } }
■MemberInfoRepository.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.example.batch.tutorial.common.repository.MemberInfoRepository"> <select id="cursor" resultType="com.example.batch.tutorial.common.dto.MemberInfoDto"> SELECT id, type, status, point FROM member_info ORDER BY id ASC </select> <update id="updatePointAndStatus" parameterType="com.example.batch.tutorial.common.dto.MemberInfoDto"> UPDATE member_info SET status = #{status}, point = #{point} WHERE id = #{id} </update> </mapper>
試したこと
下記のソース(使用した教材に記載されていたMapperインタフェースを利用しないソース)で実行するとDBへ反映できました。
(設定ファイルなどは教材にあったものをそのまま使用しています)
■PointAddTasklet.java
package com.example.batch.tutorial.dbaccess.tasklet; import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.item.ItemStreamReader; import org.springframework.batch.item.ItemWriter; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.stereotype.Component; import com.example.batch.tutorial.common.dto.MemberInfoDto; import javax.inject.Inject; import java.util.ArrayList; import java.util.List; @Component // (1) public class PointAddTasklet implements Tasklet { private static final String TARGET_STATUS = "1"; // (2) private static final String INITIAL_STATUS = "0"; // (3) private static final String GOLD_MEMBER = "G"; // (4) private static final String NORMAL_MEMBER = "N"; // (5) private static final int MAX_POINT = 1000000; // (6) private static final int CHUNK_SIZE = 10; // (7) @Inject // (8) ItemStreamReader<MemberInfoDto> reader; // (9) @Inject // (8) ItemWriter<MemberInfoDto> writer; // (10) @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { // (11) MemberInfoDto item = null; List<MemberInfoDto> items = new ArrayList<>(CHUNK_SIZE); // (12) try { reader.open(chunkContext.getStepContext().getStepExecution().getExecutionContext()); // (13) while ((item = reader.read()) != null) { // (14) if (TARGET_STATUS.equals(item.getStatus())) { if (GOLD_MEMBER.equals(item.getType())) { item.setPoint(item.getPoint() + 100); } else if (NORMAL_MEMBER.equals(item.getType())) { item.setPoint(item.getPoint() + 10); } if (item.getPoint() > MAX_POINT) { item.setPoint(MAX_POINT); } item.setStatus(INITIAL_STATUS); } items.add(item); if (items.size() == CHUNK_SIZE) { // (15) writer.write(items); // (16) items.clear(); } } writer.write(items); // (17) } finally { reader.close(); // (18) } return RepeatStatus.FINISHED; // (19) } }
【使用した教材】
・タスクレットモデルでの実装
https://macchinetta.github.io/batch-guideline/current/ja/Ch09_DBAccessJob.html#Ch09_Impl_DBAccessJob
補足情報
お手数をおかけしますが、ご教授頂けますと幸いです。
説明不足の点がございましたら追記させていただきます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。