[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 メーリングリストの案内