您的位置:

Mybatis SQL语句打印详解

一、开启Mybatis SQL语句打印

Mybatis是一款强大的ORM框架,常用的Mybatis配置文件是mybatis-config.xml,我们可以在该配置文件中开启SQL语句打印功能。具体步骤如下:

1、在mybatis-config.xml中的 标签下添加 标签

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

2、添加日志记录器

在log4j.properties文件中添加以下配置:

log4j.logger.org.apache.ibatis=DEBUG

3、配置完成

当我们启用日志记录器后,就可以在控制台看到Mybatis SQL语句的打印信息了。

二、使用LogInterceptor打印SQL语句

除了在mybatis-config.xml中开启SQL语句打印功能以外,我们还可以在Java代码中使用LogInterceptor来打印SQL语句。具体步骤如下:

1、引入LogInterceptor

import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

2、添加@Intercepts和@Signature注解

@Intercepts({
        @Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}),
        @Signature(type = StatementHandler.class, method = "update", args = {Statement.class})
})

3、在LogInterceptor中添加打印日志的代码

@Override
public Object intercept(Invocation invocation) throws Throwable {
    MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
    Object parameterObject = null;
    if (invocation.getArgs().length > 1) {
        parameterObject = invocation.getArgs()[1];
    }
    BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);
    Configuration configuration = mappedStatement.getConfiguration();
    String sql = getSql(configuration, boundSql);
    log.debug("执行sql语句:{}", sql);
    return invocation.proceed();
}

private String getSql(Configuration configuration, BoundSql boundSql) {
    String sql = boundSql.getSql();
    Object parameterObject = boundSql.getParameterObject();
    List
    parameterMappings = boundSql.getParameterMappings();
    if (parameterMappings.size() > 0 && parameterObject != null) {
        TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
        if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
            sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(parameterObject)));
        } else {
            MetaObject metaObject = configuration.newMetaObject(parameterObject);
            for (ParameterMapping parameterMapping : parameterMappings) {
                String propertyName = parameterMapping.getProperty();
                Object obj = null;
                if (metaObject.hasGetter(propertyName)) {
                    obj = metaObject.getValue(propertyName);
                } else if (boundSql.hasAdditionalParameter(propertyName)) {
                    obj = boundSql.getAdditionalParameter(propertyName);
                }
                sql = sql.replaceFirst("\\?", Matcher.quoteReplacement(getParameterValue(obj)));
            }
        }
    }
    return sql;
}

private String getParameterValue(Object obj) {
    String value = null;
    if (obj instanceof String) {
        value = "'" + obj.toString() + "'";
    } else if (obj instanceof Date) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        value = "'" + formatter.format(obj) + "'";
    } else {
        if (obj != null) {
            value = obj.toString();
        } else {
            value = "";
        }

    }
    return value;
}
   

4、在mybatis-config.xml中配置LogInterceptor

<plugins>
    <plugin interceptor="com.example.mybatis.LogInterceptor"/>
</plugins>

这样就可以在控制台看到Mybatis SQL语句的打印信息了。

三、使用Log4j2打印SQL语句

除了使用LogInterceptor来打印SQL语句以外,我们还可以使用Log4j2来实现。具体步骤如下:

1、引入Log4j2依赖

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.13.3</version>
</dependency>

2、配置Log4j2

在resources目录下新建log4j2.xml文件,添加如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="%m%n" />
        </Console>
    </Appenders>

    <Loggers>
        <Logger name="org.apache.ibatis" level="trace">
            <AppenderRef ref="console"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="console"/>
        </Root>
    </Loggers>
</Configuration>

3、测试

这样,我们就可以在控制台看到Mybatis SQL语句的打印信息了。

四、使用Logback打印SQL语句

除了使用LogInterceptor和Log4j2来打印SQL语句以外,我们还可以使用Logback来实现。具体步骤如下:

1、引入Logback依赖

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

2、配置Logback

在resources目录下新建logback.xml文件,添加如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.apache.ibatis" level="trace">
        <appender-ref ref="stdout" />
    </logger>

    <root level="info">
        <appender-ref ref="stdout" />
    </root>
</configuration>

3、测试

这样,我们就可以在控制台看到Mybatis SQL语句的打印信息了。

五、小结

通过以上几种方法,我们可以很方便地打印Mybatis SQL语句,方便我们在开发过程中进行调试和优化。