スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

S2JDBCでパラメータのMapを流れるインターフェースで書く

S2JDBCのSQLファイルを使う場合、バインドするパラメータにMAPを使う事が出来るのだが、
このMapの作成を流れるようなインターフェースで書けるようにS2JDBではParameterクラスというのが
用意されている。
使い方は以下。

1.staticインポート
Parameterクラスをstaticインポートする。

import static org.seasar.extension.jdbc.parameter.Parameter.*;

public class XXXService extends AbstractService {


2.Mapを流れるインターフェースで記述。
-----
jdbcManager.updateBySqlFile("SQLファイルのパス",
    params("key1", value1)
              .$("key2", value2)
              .$("key3", value3).$()).execute();
-----

マップのキーはSQLファイルのパラメータ名と一致させる。
最後に「.$()」を記述するのを忘れない事。
忘れると$(key, value)で返却されるMaps(Mapではない)のインスタンスとなる為、実行時に例外が発生する。
スポンサーサイト

S2JDBC-Genで自動生成したServiceクラスでSQLファイルを使用する場合の注意点

S2JDBC-Genで自動生成したServiceクラスでSQLファイルを使用とするとファイルパスの先頭に
「META-INF/sql/~」が自動的に添加されてしまい、指定したSQLファイルが見つからない。
原因は、Serviceクラスの親クラスのupdateBySqlFile()メソッドで以下の通り「sqlFilePathPrefix」変数の
値を先頭に添加している。

■S2AbstractService#updateBySqlFile()
protected SqlFileUpdate updateBySqlFile(String path, Object parameter) {
    return jdbcManager.updateBySqlFile(sqlFilePathPrefix + path, parameter);
}

この「sqlFilePathPrefix」の値は、S2AbstractServiceのsetEntityClass()メソッドで設定されており、
このメソッドをサブクラスのエンティティのServiceクラスでオーバライドすれば、パスの先頭に余計な
文字列が添加されるのを防ぐことが出来る。

■S2AbstractService#setEntityClass()
protected void setEntityClass(Class entityClass) {
    this.entityClass = entityClass;
    sqlFilePathPrefix = "META-INF/sql/"
        + StringUtil.replace(entityClass.getName(), ".", "/") + "/";
}

↓以下の通りオーバライド

■サブクラスのService#setEntityClass()
@Override
protected void setEntityClass(Class entityClass) {
    this.entityClass = entityClass;
    sqlFilePathPrefix = "";
}

S2JDBC-GenでServiceクラスを自動生成してくれるのは有難いのだが、このような仕様は不便だな。
今実装しているプロジェクトでは、自動生成したメソッドの利用頻度も低いし、jdbcManagerをラップされる
のも何かウザく感じてきたからServiceを自動生成して利用するのやめようかな。
最近は、余計なものを作るのはやめようって流れだし。
プロフィール

まこち

Author:まこち
スマートフォンのアプリ開発やWebサイト構築等を仕事や趣味でやっています。
最近はグラフデータベースも始めました。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。