目次 > 第2章 バッチフレームワークチュートリアル > 2.2 データベースアクセス機能を用いた単純なジョブ > 2.2.5 ビジネスロジックの実装
2.2.5 ビジネスロジックの実装
本節では、ビジネスロジックの実装方法について説明する。
処理内容
- 入力パラメータの“取引日”とジョブコンテキストの“運用日付”を比較する。
- “取引日”が“運用日付”以降である場合、メッセージをログに出力する。
- “残高テーブル”より、入力パラメータに対応する顧客のレコードを取得する。
- “残高テーブル”に該当する顧客レコードがない場合、新規レコードを追加する。
- 顧客ID:入力パラメータの“顧客ID”を設定
- 残高:入力パラメータの“入金金額”を設定
- 最終取引日:入力パラメータの“取引日”を設定
- 該当する顧客データがある場合、“残高”に入力パラメータの“入金金額”を加算し、レコードを更新する。
- 残高:算出した値を設定
- 最終取引日:入力パラメータの“取引日”を設定
- 処理件数をカウントアップする。
設計情報例
ジョブ主処理定義例
手順
1. “ZandakaData.java”を作成
SQLの結果を格納するクラスを作成する。なお、このクラスは“残高テーブル”の追加・更新時にはパラメータクラスとなる。
- パッケージエクスプローラビューで、“jp.terasoluna.batch.tutorial.uc0001.jb0001”パッケージを右クリックする。
- 「新規」→「クラス」を選択し、名前に“ZandakaData”を入力し、「終了」を押下する。
- “ZandakaData.java”を以下のように作成する。
/* * Copyright (c) 2007 NTT DATA Corporation * */ package jp.terasoluna.batch.tutorial.uc0001.jb0001; import java.util.Date; /** * “残高テーブル”の結果格納クラス。 */ public class ZandakaData { /** * 顧客ID */ private String kokyakuid = null; /** * 残高 */ private int zandaka = 0; /** * 最終取引日 */ private Date saisyutorihikibi = null; /** * 顧客IDを返却する。 * @return 顧客ID */ public String getKokyakuid() { return kokyakuid; } /** * 顧客IDを設定する。 * @param kokyakuid 顧客ID */ public void setKokyakuid(String kokyakuid) { this.kokyakuid = kokyakuid; } /** * 残高を返却する。 * @return 残高 */ public int getZandaka() { return zandaka; } /** * 残高を設定する。 * @param zandaka 残高 */ public void setZandaka(int zandaka) { this.zandaka = zandaka; } /** * 最終取引日を返却する。 * @return 最終取引日 */ public Date getSaisyutorihikibi() { return saisyutorihikibi; } /** * 最終取引日を設定する。 * @param saisyutorihikibi 最終取引日 */ public void setSaisyutorihikibi(Date saisyutorihikibi) { this.saisyutorihikibi = saisyutorihikibi; } }
2. “UC0001_sqlMap.xml”を編集
“残高テーブル”より“残高”を取得するSQLを定義する。
“parameterClass”にはWHERE句の条件で使用されるクラス(ここでは“java.lang.String”)を指定し、“resultClass”には手順1で作成した“ZandakaData”を指定する。
以下の定義を<sqlMap></sqlMap>内に追加する。
<select id="getZandakaData" parameterClass="java.lang.String" resultClass="jp.terasoluna.batch.tutorial.uc0001.jb0001.ZandakaData"> SELECT ZANDAKA FROM ZANDAKATABLE WHERE KOKYAKUID = #value# </select>
“残高テーブル”を更新するSQLを定義する。
“parameterClass”には“ZandakaData”を指定する。
<update id="updateZandakaData" parameterClass="jp.terasoluna.batch.tutorial.uc0001.jb0001.ZandakaData"> UPDATE ZANDAKATABLE SET ZANDAKA = #zandaka#, SAISYUTORIHIKIBI = #saisyutorihikibi# WHERE KOKYAKUID = #kokyakuid# </update>
“残高テーブル”に新規レコードを追加するSQLを定義する。 “parameterClass”には“ZandakaData”を指定する。
<insert id="insertZandakaData" parameterClass="jp.terasoluna.batch.tutorial.uc0001.jb0001.ZandakaData"> INSERT INTO ZANDAKATABLE(KOKYAKUID, ZANDAKA, SAISYUTORIHIKIBI) VALUES (#kokyakuid#, #zandaka#, #saisyutorihikibi#) </insert>
3. “application-messages.properties”を編集
“取引日”が“運用日付”以降である場合に出力するメッセージを定義する。
“terasoluna-batch-blank\batchapps\application-messages.properties”を開き、以下のメッセージ定義を追加する。
msg.SampleMsg=顧客ID"{0}"の取引日が運用日付以降です。
4. “DBBLogic.java”を作成
ビジネスロジッククラスを作成する。作成するクラスは“jp.terasoluna.fw.batch.openapi.BLogic”インタフェースを実装し、型パラメータを定義すること。
ここでは、型パラメータに「2.2.4 対象データ取得処理の準備」の手順1で作成した“NyukinData”と、「2.2.2 ジョブコンテキストの実装」の手順1で作成した“DBJobContext”を指定する。
- パッケージエクスプローラビューで、“jp.terasoluna.batch.tutorial.uc0001.jb0001”パッケージを右クリックする。
- 「新規」→「クラス」を選択し、名前に“DBBLogic”を入力し、「終了」を押下する。
- “DBBLogic.java”を以下のように作成する。
/* * Copyright (c) 2007 NTT DATA Corporation * */ package jp.terasoluna.batch.tutorial.uc0001.jb0001; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import jp.terasoluna.batch.tutorial.uc0001.JB0001JobContext; import jp.terasoluna.batch.tutorial.uc0001.JB0001Data; import jp.terasoluna.fw.batch.messages.MessageAccessor; import jp.terasoluna.fw.batch.openapi.BLogic; import jp.terasoluna.fw.batch.openapi.BLogicResult; import jp.terasoluna.fw.batch.openapi.ReturnCode; import jp.terasoluna.fw.dao.QueryDAO; import jp.terasoluna.fw.dao.UpdateDAO; /** * ビジネスロジッククラス。 */ public class DBBLogic implements BLogic<JB0001Data, JB0001JobContext> { /** * ログクラス。 */ private static final Log log = LogFactory.getLog(DBBLogic.class); /** * DAOクラス。 * Springによりインスタンス生成され設定される。 */ private QueryDAO queryDAO = null; /** * DAOクラス。 * Springによりインスタンス生成され設定される。 */ private UpdateDAO updateDAO = null; /** * メッセージ取得クラス。 * Springによりインスタンス生成され設定される。 */ private MessageAccessor messageAccessor = null; /** * ビジネスロジックを実行する。 * @param nyukinData 入力パラメータ * @param jobContext ジョブコンテキスト */ public BLogicResult execute(JB0001Data nyukinData, JB0001JobContext jobContext) { //取引日と運用日付の比較 Date torihikibi = nyukinData.getTorihikibi(); Date unyohiduke = jobContext.getUnyohiduke(); if (!torihikibi.before(unyohiduke)) { //取引日 >= 運用日付 ならばメッセージを取得しログに出力する。 String[] args = {nyukinData.getKokyakuid()}; String message = messageAccessor.getMessage("msg.SampleMsg",args); log.warn(message); /* 「2.2.5 例外処理の実装」では以下のコメント行を有効にする。 */ /* //ビジネスロジック結果オブジェクトを返却する。 BLogicResult result = new BLogicResult(ReturnCode.ERROR_END); //任意のジョブ終了コードを設定する場合は、以下のように第2引数にジョブ終了コードを指定する。 //BLogicResult result = new BLogicResult(ReturnCode.ERROR_END, 99); return result; */ } //残高テーブル参照 ZandakaData zandakaData = queryDAO.executeForObject("UC0001.getZandakaData", nyukinData.getKokyakuid() , ZandakaData.class); //該当レコードがある場合は残高計算と更新 if (zandakaData != null) { int zandaka = zandakaData.getZandaka() + nyukinData.getNyukin(); zandakaData.setZandaka(zandaka); zandakaData.setSaisyutorihikibi(nyukinData.getTorihikibi()); zandakaData.setKokyakuid(nyukinData.getKokyakuid()); updateDAO.execute("UC0001.updateZandakaData", zandakaData); //該当レコードが無い場合は新規作成 } else { zandakaData = new ZandakaData(); zandakaData.setKokyakuid(nyukinData.getKokyakuid()); zandakaData.setZandaka(nyukinData.getNyukin()); zandakaData.setSaisyutorihikibi(nyukinData.getTorihikibi()); updateDAO.execute("UC0001.insertZandakaData", zandakaData); } //処理件数をカウントアップ jobContext.incrementCount(); //ビジネスロジック処理結果オブジェクトを返却する BLogicResult result = new BLogicResult(ReturnCode.NORMAL_CONTINUE); return result; } /** * QueryDAOを設定する。 * @param queryDAO 設定するQueryDAO */ public void setQueryDAO(QueryDAO queryDAO) { this.queryDAO = queryDAO; } /** * UpdateDAOを設定する。 * @param updateDAO 設定するUpdateDAO */ public void setUpdateDAO(UpdateDAO updateDAO) { this.updateDAO = updateDAO; } /** * メッセージ取得クラスを設定する。 * @param msgAcc メッセージ取得クラス */ public void setMessageAccessor(MessageAccessor msgAcc) { this.messageAccessor = msgAcc; } }
5. “JB0001.xml”を編集
“JB0001.xml”にビジネスロジックの定義を追加する。
手順4で作成した“DBBLogic”を指定するため、以下の定義を<beans></beans>内に追加する。
<!-- ビジネスロジック --> <bean id="blogic" class="jp.terasoluna.batch.tutorial.uc0001.jb0001.DBBLogic"> <property name="queryDAO" ref="queryDAO" /> <property name="updateDAO" ref="updateDAO" /> <property name="messageAccessor" ref="messageAccessor"/> </bean>
“blogic”、“queryDAO”、“updateDAO”および“messageAccessor”はBatch版が規定する固定のBeanである。
“queryDAO”および“updateDAO”はデータベースアクセス用のBeanであり、“messageAccessor”はメッセージ取得用Beanである。
参考資料
- 『BB-01 データベースアクセス機能』
- 『BD-01 ビジネスロジック実行機能』
- 『BF-01 メッセージ管理機能』