SQLのログ機能を強化

次のバージョンで、SQLの種別(SELECTかINSERTかとか)を簡単に判別してログ出力可能にします。対応しようと思ったきっかけは、seasar-userのML。http://ml.seasar.org/archives/seasar-user/2009-December/018946.html

DBFluteのログ出力でSelect文以外のSQL(Update、Insert等)のログだけ取得したい場合、
どのような設定が必要ですか?

O/Rマッパーを使っていると確かにそういう局面ありますね。


Domaでは、JdbcLoggerというインタフェースを提供していて、これを実装してもらうと好きなフォーマットでSQLをログ出力できます。(もちろん使うログライブラリは自由)

public interface JdbcLogger {
    void logSql(String callerClassName, String callerMethodName, Sql<?> sql);
    ...
}

logSqlメソッドでわたってくるパラメータにSqlというインタフェースがあるのですが、ここにSQLの種別を返すgetKindメソッドを追加することにしました。

public interface Sql<P extends SqlParameter> {
    SqlKind getKind(); // これを新規に追加
    String getRawSql();
    String getFormattedSql();
    String getSqlFilePath();
    List<P> getParameters();
}

SqlKindはこんなEnum型。Daoのメソッドに指定するアノテーションに対応しています。

public enum SqlKind {
    SELECT,
    INSERT,
    UPDATE,
    DELETE,
    BATCH_INSERT,
    BATCH_UPDATE,
    BATCH_DELETE,
    PROCEDURE,
    FUNCTION
}

SqlKindを使えば特定のSQLだけログに記録するということが簡単にできます。

public class MyJdbcLogger implements JdbcLogger {

    public void logSql(String callerClassName, String callerMethodName, Sql<?> sql) {
        switch (sql.getKind()) {
        case INSERT:
        case UPDATE:
        case DELETE:
            ...
            break;
        }
    }
    ...
}