MyBatisで生成されたSQLを確認する方法

MyBatisで生成されたSQLを確認する方法

MyBatisで生成されたSQLを確認する方法

MyBatisで実行されるSQLを確認するには、いくつかの方法があります。
以下では、具体例を示します。

1. MyBatisのログ設定を利用する

MyBatisでは、ログフレームワーク(Log4j、SLF4Jなど)を使用してSQLのログを出力することができます。
MyBatisの設定ファイルでログの出力を有効にし、ログレベルをDEBUGに設定します。

<例: Log4jを使用した設定>

<configuration>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
</configuration>

Log4jの設定ファイル(log4j.properties)で、MyBatisのパッケージのログレベルをDEBUGに設定します。

log4j.logger.org.apache.ibatis=DEBUG
log4j.logger.org.mybatis.example=DEBUG

この設定により、testテーブルに関連するクエリが実行された際、そのSQLがログに出力されます。

2. SqlSessionのgetConfiguration().getMappedStatement()を使用する

Javaコード内で実行されるSQLをプログラム的に確認することも可能です。
例えば、testUserMapperというMapperインターフェースがあるとします。

<例: SqlSessionを使用したSQLの取得>

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.mapping.MappedStatement;

public class TestApp {
    public static void main(String[] args) {
        try (SqlSession session = MyBatisUtil.getSqlSessionFactory().openSession()) {
            Configuration configuration = session.getConfiguration();
            MappedStatement ms = configuration.getMappedStatement("testUserMapper.selectTestUser");
            String sql = ms.getBoundSql(null).getSql();
            System.out.println(sql);
        }
    }
}

このコードは、testUserMapperに定義されたselectTestUserメソッドで生成されるSQLを出力します。

3. Interceptorを使用する

MyBatisのInterceptorを使用して、SQLの実行前にSQLをログ出力することもできます。

<例: Interceptorを使用したSQLログ出力>

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;

import java.sql.Connection;
import java.util.Properties;

@Intercepts({
    @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class TestSqlInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        String sql = statementHandler.getBoundSql().getSql();
        System.out.println("Generated SQL: " + sql);
        return invocation.proceed();
    }

    @Override
    public void setProperties(Properties properties) {
        // プロパティが必要な場合に使用
    }
}

このInterceptorは、任意のSQLが実行される前にそのSQLをコンソールに出力します。
MyBatis設定ファイルにこのInterceptorを登録して使用します。

まとめ

MyBatisで生成されたSQLを確認するには、ログ設定を行う方法、Javaコードで直接取得する方法、Interceptorを利用する方法があります。
他にも方法がありますが、上記が簡単に確認できる方法になります。