サポート > Wagby Developer Network > カスタマイズ事例 > 自動生成されたデータベースアクセス処理を利用する

Wagby 定義ファイルで用意したモデル定義については、基本的なデータベースアクセス処理(CRUD)のソースコードが自動生成されています。ここでは、その利用方法を説明します。

Show 系プロセスビーン

Show 系プロセスビーンを使うことで、データベースから一つのオブジェクトを取得することができます。 パラメータとして、対象となるオブジェクトを確定させるための「主キー」が必要です。

ここでは、モデル Jyukosya を取得するコードを紹介します。主キーは jyukosyaid とします。

String userid = "123"; // 主キー
Jyukosya jyukosya = null;
ProcessBean pbean =
    (ProcessBean)p.appctx.getBean("ShowJyukosyaProcessBean");
pbean.setActionParameter(p);
pbean.setParameter("jyukosyaid", userid);
try {
    Object op = pbean.process();
    if (op != null && op instanceof Jyukosya) {
        jyukosya = (Jyukosya)op;
    }
} catch (Exception e) {
    p.logger.warn(e.getMessage());
} finally {
    pbean.release();
}

このコードのポイントを説明します。

  • プロセスビーンは DI コンテナ(Spring)から取得します。
  • プロセスビーンには ActionParameter 型の変数 p をセットします。
  • setParameter メソッドを用いて、主キーをセットします。
  • プロセスビーンの戻り値は、対象オブジェクトまたはエラーメッセージです。instanceof 演算子で戻り値の型を判定してください。
  • プロセスビーンは例外 SecurityException を返すことがあります。この場合、利用者が(このプロセスビーンを実行する)権限がなかったことを意味します。
  • プロセスビーンは使い終わったら release メソッドを呼び出してください。

ShowList 系プロセスビーン

ShowList 系のプロセスビーンを用いることで、検索条件で絞り込んだ複数のオブジェクトを得ることができます。 ここで、検索条件として指定できる項目は、Wagby 定義ファイル中で「検索条件」として指定したものに限ります。

ここでは、モデル Jyukosya を項目 mailaddress で絞り込みし、その結果を得るコードを紹介します。

Jyukosya[] jyukosya_ary = null;
ProcessBean pbean =
    (ProcessBean)p.appctx.getBean("ShowListJyukosyaProcessBean");
pbean.setActionParameter(p);
JyukosyaC cond = new JyukosyaC();
cond.setMail(mailaddress);
pbean.setParameter(ProcessBean.ConditionParamName, cond);
ResultBean rbean = new ResultBean();
try {
    rbean.setProcessBean(pbean);
    rbean.setSizePerPage(-1); // 無制限
    rbean.setWishCloseConnection(true);
    rbean.processProcessBean(p, errorManager);

    List coll = rbean.getCurrentPageItem(p, errorManager);
    if (coll != null && coll.size() > 0) {
        jyukosya_ary = (Jyukosya[])coll.toArray(new Jyukosya[0]);
    }
} finally {
    rbean.release();
}

このコードのポイントを説明します。

  • プロセスビーンは DI コンテナ(Spring)から取得します。
  • プロセスビーンには ActionParameter 型の変数 p をセットします。
  • 検索条件にはコンディションモデル(ここでは JyukosyaC)を用います。
  • 検索結果はリザルトビーン (ResultBean) クラスに格納されます。
  • リザルトビーンクラスのインスタンス rbean の setSizePerPage メソッドに "-1" を指定することで、条件に合致したデータをすべて取得することができます。この場合、全データをいったんメモリ上に確保しようとするので、大量データの扱いには不向きとなります。ご注意ください。
  • プロセスビーンは例外 SecurityException を返すことがあります。この場合、利用者が(このプロセスビーンを実行する)権限がなかったことを意味します。ですので、処理全体を try 〜 finally ブロックで囲みます。
  • リザルトビーンは使い終わったら release メソッドを呼び出してください。これでプロセスビーンも解放されます。

Insert 系プロセスビーン

Insert 系のプロセスビーンを用いると、モデルをデータベースに登録することができます。

ここでは、モデル Jyukosya を新規に登録するコードを紹介します。

Jyukosya jyukosya = null;
pbean = (ProcessBean)p.appctx.getBean("InsertJyukosyaProcessBean");
pbean.setActionParameter(p);
try {
    jyukosya = new Jyukosya();
    ((jp.jasminesoft.wagby.app.jyukosya.JyukosyaHelper)p.appctx.
      getBean("JyukosyaHelper")).initialize(jyukosya, p);

    // 独自に値を設定した例...
    jyukosya.setJyukosyaid(id);
    jyukosya.setMail(mailaddress);

    pbean.setParameter("jyukosya", jyukosya);
    String errmsg = (String)pbean.process();
    if (errmsg != null && errmsg.length() > 0) {
        p.logger.warn("An error (" + errmsg + ") has occured.");
    }
} catch (Exception e) {
    logger.warn("An error (" + e.getMessage() + ") has occured.");
} finally {
    pbean.release();
}

このコードのポイントを説明します。

  • プロセスビーンは DI コンテナ(Spring)から取得します。
  • プロセスビーンには ActionParameter 型の変数 p をセットします。
  • Jyukosya オブジェクトを生成した場合、ヘルパクラスの initialize メソッドを通します。ヘルパクラスも DI コンテナから取得します。
  • プロセスビーンの setParameter メソッドで対象となるオブジェクトを格納します。
  • プロセスビーンはエラーメッセージを返します。このメッセージに何らかの文字が格納された場合はエラーを意味します。
  • プロセスビーンは例外 SecurityException を返すことがあります。この場合、利用者が(このプロセスビーンを実行する)権限がなかったことを意味します。
  • トランザクション境界はプロセスビーンの process メソッドになります。このメソッドが完了した時点でデータベースのコミット処理が行われています。
  • プロセスビーンは使い終わったら release メソッドを呼び出してください。

将来の Wagby R6 では、トランザクション境界を Spring で指定できるようにする予定です。

Update 系プロセスビーン

Update 系のプロセスビーンを用いると、モデルをデータベースに更新することができます。 このとき、更新対象のオブジェクトのロック取得および解放処理を行うようにしてください。

ここでは、モデル Jyukosya を更新するコードを紹介します。

// 更新対象となる jyukosya オブジェクトはすでに用意されているものとする。
// ロックマネージャの準備
LockManager lman = LockManagerFactory.getLockManager();
String sessionid = p.request.getSession().getId();
LockObject lo1 =
    lman.createLockObject("jyukosya", // モデル名(英語)
        Integer.toString(jyukosya.getJyukosyaid()), // 主キー
        sessionid,
        p.user);
LockObject _lo1 = null;

if ((_lo1 = lman.addLockObject(lo1)) != null) {
    // ロック取得失敗
    logger.warn("Update jyukosya is failed, lock error, "+jyukosya);
} else {
    pbean = (ProcessBean)p.appctx.getBean("UpdateJyukosyaProcessBean");
    pbean.setActionParameter(p);
    pbean.setParameter("jyukosya", jyukosya);
    try {
        String errmsg = (String)pbean.process();
        if (errmsg != null && errmsg.length() > 0) {
            p.logger.warn("An error (" + errmsg + ") has occured.");
        }
    } catch (Exception e) {
        logger.warn("An error (" + e.getMessage() + ") has occured.");
    } finally {
        pbean.release();

        lman.releaseLockObject(lo1); // ロックの解放
    }
}

このコードのポイントを説明します。

  • Wagby が提供する LockManager クラスを使って、ロックキーを取得します。取得に失敗した場合は、更新処理を行わせないようにしてください。
  • プロセスビーンは DI コンテナ(Spring)から取得します。
  • プロセスビーンには ActionParameter 型の変数 p をセットします。
  • Jyukosya オブジェクトを生成した場合、ヘルパクラスの initialize メソッドを通します。ヘルパクラスも DI コンテナから取得します。
  • プロセスビーンの setParameter メソッドで対象となるオブジェクトを格納します。
  • プロセスビーンはエラーメッセージを返します。このメッセージに何らかの文字が格納された場合はエラーを意味します。
  • プロセスビーンは例外 SecurityException を返すことがあります。この場合、利用者が(このプロセスビーンを実行する)権限がなかったことを意味します。
  • トランザクション境界はプロセスビーンの process メソッドになります。このメソッドが完了した時点でデータベースのコミット処理が行われています。
  • プロセスビーンは使い終わったら release メソッドを呼び出してください。
  • 取得したロックキーは必ず解放してください。
  • 更新後のオブジェクトキャッシュのクリア処理は、UpdateXXXProcessBean 内で行われます。

将来の Wagby R6 では、トランザクション境界を Spring で指定できるようにする予定です。

ビュー(JSP)への出力

扱ったデータをビュー側(JSP)へ出力する場合、これを「プレゼンテーションモデル」へと変換する必要があります。

JyukosyaP jyukosya_p =
  ((jp.jasminesoft.wagby.app.jyukosya.JyukosyaPHelper)p.appctx.
    getBean("JyukosyaPHelper")).
      s2p(jyukosya,
          p,
          jp.jasminesoft.wagby.app.jyukosya.JyukosyaPHelper.SHOW);

p.request.setAttribute("jyukosya_p", jyukosya_p);

ビュー側(JSP) では、JSTL と EL 式を用いて、プレゼンテーションモデルの値を参照させるようにします。

このページ

カスタマイズ事例