Mybatisで実行SQLを取得する方法

Mybatisで実行SQLを取得する方法

MyBatisで実行SQLを取得する方法について説明します。

MyBatisで実行SQLをログに出力する方法

MyBatisでは、ConfigurationクラスのlogImplプロパティを使用して、実行SQLをログに出力できます。
以下は、testMyBatisConfigという設定クラスでログを出力する設定例です。

package com.example.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.Configuration;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class testMyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);

        Configuration configuration = new Configuration();
        // Log4j2を使用してSQLログを出力する
        configuration.setLogImpl(org.apache.ibatis.logging.log4j2.Log4j2Impl.class);

        sessionFactory.setConfiguration(configuration);
        return sessionFactory.getObject();
    }
}

SQLを取得する方法

特定の場面で実行SQLを直接取得したい場合、MyBatisのSqlSessionやExecutorをカスタマイズする方法があります。
以下はtestSqlSessionというクラスを使った例です。

package com.example.mybatis;

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

public class testSqlSession {

    private final SqlSessionFactory sqlSessionFactory;

    public testSqlSession(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public String getExecutedSql(String statement, Object parameter) {
        try (SqlSession session = sqlSessionFactory.openSession()) {
            Configuration configuration = session.getConfiguration();
            MappedStatement ms = configuration.getMappedStatement(statement);
            BoundSql boundSql = ms.getBoundSql(parameter);
            return boundSql.getSql();
        }
    }
}

まとめ

  • logImplを設定することで、自動的に実行SQLをログに出力できます。
  • SqlSessionを利用して、手動で実行SQLを取得することも可能です。