[Seasar-user:8549] Re: S2Daoで発行したSQLを取得したい

kubo [E-MAIL ADDRESS DELETED]
2007年 6月 21日 (木) 14:38:09 JST


久保(jflute)です。

> 過去に,
> [Seasar-user:6583] Re: S2Daoで発行したSQLを、メソッド実行後に取得したい
> の話題がでていたのですが,
> 
> 私の方でも,DBへの更新系SQL文自体をDBに格納するというニーズがでてきまし
> た.

自分のプロジェクトでも同様で、画面Requestで発生したSQLを全てDBに記録する
という仕様が存在し、試行錯誤しました。(Select文も)

> SqlCommandを取得した後にSqlCommand#getSqlで,
> S2DaoがDBに発行しようとしているSQLはとれるのかなと思っていますが,
> いかがでしょうか?

SqlCommand#getSqlだと、先にせとさんが回答されているとおり、
純粋なSQLになりません。



なので、自分は以下のように致しました。

1. 独自のPreparedStatementを作成

  A. S2が生成するPreparedStatementをラップして委譲メソッドを作成
  B. パラメータ設定のsetXxx()内で、index(int)とvalueを保持
  C. executeXxx()内で、実行したSQLとvalueをつき合わせて表示用SQLを作成。
      → S2JDBCのSQL文出力処理メソッドを借りる
  D. 設定されたHandlerに実行情報を渡す。(Callback)


2. 独自のStatementFactoryを作成

  A. 「1」の独自のPreparedStatementを返す。
  B. 「1-D」のHandlerを実装して独自のPreparedStatementに渡す。
      → TheadLocalに格納する

3. DBに格納するInterceptorをPageに設定する。

  A. InterceptorではTheadLocalからSQL実行情報を取り出してDBへ


executeBatch()に関してはまだ未対応ですが、
上記のやり方で、キレイにSQLをDBに記録することができました。

「1」のPreparedStatementはDBFluteのClassとして存在しています。
  (独自のStatementFactoryを設定することで利用可能になる)

かといってDBFluteに依存している部分はありませんので、
参考にはなるのではないかと思いました。

DBFluteのExampleで
「org.seasar.dbflute.example.dbflute.ldb.allcommon.jdbc.history.TraceablePreparedStatement」
というクラスがいますのでもしよければ参考にしてみて下さい。(開発中ですが...)
https://www.seasar.org/svn/sandbox/dbflute/trunk/dbflute-example





Seasar-user メーリングリストの案内