質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Spring Batch

Spring Batchは、バッチ処理向けに定義されたオープンソースのフレームワーク。エンタープライズシステムで避けて通れないバッチ処理を可能にします。設定ファイルに別定義することで効率よく開発することがで可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1549閲覧

【Spring Batch】データ入出力ジョブの作成

emily_

総合スコア0

Spring Batch

Spring Batchは、バッチ処理向けに定義されたオープンソースのフレームワーク。エンタープライズシステムで避けて通れないバッチ処理を可能にします。設定ファイルに別定義することで効率よく開発することがで可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2020/10/16 04:13

編集2020/10/17 06:12

前提・実現したいこと

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

補足情報

お手数をおかけしますが、ご教授頂けますと幸いです。
説明不足の点がございましたら追記させていただきます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

item.setId(readRec.getId());
の一文が不足しておりました。

閲覧いただき有難うございます。

投稿2020/10/25 07:01

編集2020/10/25 10:43
emily_

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問