1. 概要
作業中につまづいたので備忘として書いておこうと思いました。
SpringBatchの機能である「JobParameter」ですが、これを直接SQLで使用することは少ないとは思います。
かなり限定的な状況で必要になったのですが、さすがにこんな事を解説している記事は無かった為、
大した事ではありませんが少々時間を浪費しました。。
2. JobParametersについて
せっかくなので、「JobParameters」について軽く触れておきます。
概要でも記載した通りSpringBatchの機能で、コマンドラインからの引数を受け取る機能です。
batファイルなどで設定された引数がJobParametersに格納され、
Java側でクラス変数に以下のアノテーションを付与することで取得することが出来ます。
@Value("#{jobParameters['コマンドライン引数名']}")
private String jobParam;
SpringBatchとしては設定できる引数の数には特に制限はありませんが、OS的にコマンド引数の長さに限界があるので、注意が必要です。
3. SQLでの使用方法について
前述したとおり、基本的には変数に格納して使用するのでこんな事やることはない思いますが
=====
環境別にSQLを分岐させたい。
(ServiceやRepositoryなどのロジックは共通で、sqlMapのxmlのみを環境別に入れ替えるイメージ)
↓
既存SQLはパラメータを使用していないが、分岐用の新SQLはパラメータを使用したい。
↓
既存のServiceクラスがなぜかJobParamters型でJobParametersを取得していて、
Service側は諸々の諸事情で改修したくないので、
JobParameters型のままパラメータとして使用したい。
====
という極めて稀なパターンで効果を発揮します。(?)
対応としては、以下のような対応になります。
(以下の記述はサンプルでしかないので、これをそのまま動作させても動作しません)
SampleServiceImpl.java
今回はJobParameters単体をパラメータとして使用するパターンと
Mapに格納して使用するパターンを記載します。
package com.gotoMap.domain.service;
import java.util.HashMap;
import java.util.Map;
import org.springframework.batch.core.JobParameters;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import com.gotoMap.domain.repository.SampleRepository;
public class SampleServiceImpl {
@Autowired
SampleRepository repository;
@Value("#{jobParameters['hoge.param001']}")
private JobParameters param001;
@Value("#{jobParameters['hoge.param002']}")
private JobParameters param002;
@Value("#{jobParameters['hoge.param003']}")
private JobParameters param003;
// JobParameters単体使用パターン
public void sampleMethodSingleParam() {
repository.selectSingleParam(param001);
}
// Map使用パターン
public void sampleMethodMapParam() {
Map<String, JobParameters> paramMap = new HashMap<>();
paramMap.put("jobParam1", param001);
paramMap.put("jobParam2", param002);
paramMap.put("jobParam3", param003);
repository.selectMapParam(paramMap);
}
}
SampleRepository.java
必ず「@Param」でパラメータ名を指定してください。
JobParameters単体での使用では不要かもしれませんが、Mapでの使用はこの設定が必須となります。
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import org.springframework.batch.core.JobParameters;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import org.springframework.batch.core.JobParameters;
public interface SampleRepository {
//JobParameters単体使用
public void selectSingleParam(@Param("param") JobParameters param);
//MapのValueにJobParametersを使用
public void selectMapParam(@Param("paramMap") Map<String, JobParameters> paramMap);
}
SampleRepository.xml
JobParamtersを使用する為には以下のように
「パラメータ名.parameter」が必要になります。
当然ながら、パラメータとして渡ってきているのは”値”ではなくJobParameters型のClassObjectです。
そのため、値が格納されている変数を追加で指定しなければ取得できません。
Map型の場合も取得方法は変わりません。
変数名とキー値を指定し、parameterを定義するだけです。
<select id="selectSingleParam">
SELECT
*
FROM
SMAPLE
WHERE
ID = #{param.parameter}
</select>
<select id="selectMapParam">
SELECT
*
FROM
SMAPLE
WHERE
ID = #{paramMap.jobParam1.parameter} AND
NAME = #{paramMap.jobParam2.parameter} AND
AGE = #{paramMap.jobParam3.parameter}
</select>
4.おわりに
現場作業だと合理性より工数優先で動くことも多いと思います。
そんな場面で、こういった無駄知識の発信も誰かの役に立てば嬉しいです。