表示用SQL

表示用SQLとは?

DBFluteで発行されるSQLは、基本的にバインド変数が利用されます。 一部、バインド変数を使わずに条件値を埋め込む機能もありますが、本当にいざそれが必要になる場面でのみの利用を前提としています。

実行SQLそのままだと...(表示用SQLでない場合)

バインド変数を使ったSQLは、SQL文に条件値が埋め込まれず、変数部分が "?" などの変数表記になっています。よって、実行されたSQLをそのままログに表示しても、人にはわかりづらいSQLになってしまいます。 別途、条件値をリスト形式などで表示することもできますが、バインド変数と条件値を頭の中で順番に当てはめなければなりません。

e.g. 実行時のSQLをそのまま表示すると...何がなにやら @ExecutedSql
update MEMBER
   set MEMBER_STATUS_CODE = ?
     , FORMALIZED_DATETIME = ?
     , UPDATE_DATETIME = ?
     , UPDATE_USER = ?
     , UPDATE_PROCESS = ?
     , VERSION_NO = VERSION_NO + 1
 where MEMBER_ID in (
select dfloc.MEMBER_ID 
  from MEMBER dfloc 
 where dfloc.MEMBER_STATUS_CODE = ?
   and exists (select sub1loc.MEMBER_ID
                 from PURCHASE sub1loc 
                where sub1loc.MEMBER_ID = dfloc.MEMBER_ID
                  and sub1loc.PAYMENT_COMPLETE_FLG = ?
       )
)

表示用SQLの場合

DBFluteでは、バインド変数表記を条件値で埋め込んだSQLを別途生成し、デバッグログとして出力します。 これを人が見てわかりやすいSQLということで、表示SQL (DisplaySql) と呼びます。

e.g. DBFluteは表示用SQLでデバッグログに出力 @DisplaySql
update MEMBER
   set MEMBER_STATUS_CODE = 'PRV'
     , FORMALIZED_DATETIME = null
     , UPDATE_DATETIME = '2010-11-16 15:54:48.624'
     , UPDATE_USER = 'testUser'
     , UPDATE_PROCESS = 'WxBhvQueryUpdateTest[main]'
     , VERSION_NO = VERSION_NO + 1
 where MEMBER_ID in (
select dfloc.MEMBER_ID 
  from MEMBER dfloc 
 where dfloc.MEMBER_STATUS_CODE = 'FML'
   and exists (select sub1loc.MEMBER_ID
                 from PURCHASE sub1loc 
                where sub1loc.MEMBER_ID = dfloc.MEMBER_ID
                  and sub1loc.PAYMENT_COMPLETE_FLG = 0
       )
)

表示SQLのメリットは、単に見やすいという話に留まりません。 そのままコピーしてSQLツールなどで実行でき、込み入った問題が発生した時などに動作確認を行うことができます。

厳密には実行SQLとは別のSQL

厳密には、実行SQLとは別のSQLです。実行SQLはバインド変数を利用しています。表示用SQLは条件値を埋め込んでいます。 その違いが顕著に現れるのは日付型の条件値の場合です。表示用SQLで、"2010-11-16 15:54:48.624" と表示されていても、この日付フォーマットで検索をしているわけではありません。 日付オブジェクトのまま条件をDBに渡していますので、フォーマットは無関係です。人が見やすいようにたまたまこの形でフォーマットして表示されているだけです。

この違いにより、稀に表示SQLをコピーしてSQLツールで実行しても実行できない場合があります。日付リテラルの文法(フォーマットの解析仕様)が DBMS によって違うからです。できる限り合わせるようにしていますが(例えば、Oracleでは対応する日付リテラルが利用されます)、対応できていない DBMS がある場合に日付フォーマット(日付リテラル)を調整することができます。

S2Daoから継承

この機能は S2Dao を参考に、DBFluteで多少の独自改良を加えたものです。

S2Dao

ConditionBean から表示用SQLを取得

条件を設定済みの ConditionBean から表示用SQLを取得することができます。 通常は利用することはほとんどありませんが、ConditionBean の実装を外だしSQLに切り替えるような場合に、外だしSQLの土台SQLとして(途中まで実装した) ConditionBean の表示用SQLを使うという場合に有効です。

日付型フォーマットの調整

表示用SQLにおける日付型フォーマットを変更することができます。DBFluteConfig の logDateFormat、logTimestampFormat を利用することで変更できます。