以下是基于 Spring Boot + Logback + MyBatis-Plus 的配置方案,实现输出数据库 SQL 执行语句的详细步骤:

在这里插入图片描述


1. 核心配置步骤

1.1 设置日志级别为 DEBUG

application.propertiesapplication.yml 中开启 MyBatis-Plus 的 SQL 日志输出:

# application.properties
logging.level.com.baomidou=DEBUG
logging.level.root=INFO
# application.yml
logging:
  level:
    com.baomidou: DEBUG
    root: INFO
1.2 确保 MyBatis-Plus 日志插件已启用

MyBatis-Plus 默认通过 SqlScriptLogger 输出 SQL,但需确保在配置类中添加日志拦截器(如需更细粒度控制):

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public ISqlInjector sqlInjector() {
        return new.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor();
    }

    // 可选:添加日志拦截器(非必须,但可增强日志格式)
    @Bean
    publicInterceptor logInterceptor() {
        return new LoggingInterceptor();
    }
}

2. Logback 日志格式配置

若需自定义日志输出格式(如显示 SQL 参数、执行时间等),需在 logback-spring.xml 中配置:

<configuration>
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 格式化输出,包含线程、时间、日志级别、类名、SQL语句 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- MyBatis-Plus SQL 日志配置 -->
    <logger name="com.baomidou.mybatisplus" level="DEBUG"/>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
    </root>
</configuration>

3. 验证 SQL 输出

配置完成后,执行数据库操作(如通过 MyBatis-Plus 的 BaseMapper 进行查询),控制台应输出类似以下内容:

2023-10-01 12:34:56.789 [main] DEBUG c.b.mybatisplus.core.override.MybatisMapperMethod -  
==>  Preparing: SELECT * FROM user WHERE id = ? 
==> Parameters: 1(Integer)
<==      Total: 1

4. 高级配置(可选)

4.1 输出 SQL 执行时间

logback-spring.xmlpattern 中添加 %X{duration}(需 MyBatis-Plus 插件支持):

<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - [%X{duration}ms] %msg%n</pattern>
4.2 输出 SQL 参数细节

若需显示参数值(如 ? 替换为实际值),需在 MyBatis 配置中启用参数日志:

# application.properties
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl

5. 常见问题排查

问题 解决方案
SQL 未输出 检查日志级别是否为 DEBUG,且包路径是否为 com.baomidou
参数未显示 确保 MyBatis 的 log-impl 配置正确,并检查依赖是否冲突。
日志格式异常 核对 logback-spring.xml 的 XML 语法是否正确。

完整配置示例

application.properties
# 启用 SQL 日志
logging.level.com.baomidou=DEBUG
# MyBatis 日志实现
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
logback-spring.xml
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- MyBatis-Plus SQL 日志 -->
    <logger name="com.baomidou.mybatisplus" level="DEBUG"/>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

关键点总结

  1. 日志级别:必须设置 com.baomidou 包为 DEBUG
  2. 依赖兼容性:确保 MyBatis-Plus 3.1.2 与 Spring Boot 2.3.2 的依赖无冲突。
  3. 日志格式:通过 Logback 的 pattern 自定义输出格式,可包含 SQL、参数、执行时间等。

如需进一步优化日志格式或实现文件滚动输出,可参考 Logback 官方文档调整配置。

以下是基于 Spring Boot + Logback + MyBatis-Plus 的配置方案,实现输出 SQL 语句 + 参数列表 的详细步骤:


1. 核心配置步骤

1.1 设置日志级别为 DEBUG

application.properties 中开启 MyBatis-Plus 的 SQL 日志输出:

# 启用 SQL 日志
logging.level.com.baomidou=DEBUG
# 启用 MyBatis 参数日志(显示参数值)
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
1.2 添加 MyBatis-Plus 日志拦截器

在 MyBatis-Plus 配置类中添加 LoggingInterceptor,确保 SQL 和参数被记录:

@Configuration
public class MyBatisPlusConfig {
    @Bean
    publicInterceptor loggingInterceptor() {
        return new LoggingInterceptor();
    }
}
1.3 自定义拦截器(可选,增强参数显示)

若默认拦截器未满足需求(如参数未显示),可编写自定义拦截器捕获 SQL 和参数:

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Statement;
import java.util.Properties;

@Intercepts({@Signature(type = StatementHandler.class, method = "query", args = Statement.class)})
public class CustomLoggingInterceptor implements Interceptor {
    private static final Logger logger = LoggerFactory.getLogger(CustomLoggingInterceptor.class);

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Statement statement = (Statement) invocation.getArgs()[0];
        String sql = statement.toString().split(":")[1].trim();
        logger.debug("SQL: {}", sql);
        // 获取参数(需结合 MyBatis 的 BoundSql 实现,此处简化示例)
        // 详细参数获取需通过 MyBatis 上下文,具体实现可参考 LoggingInterceptor 源码
        logger.debug("Parameters: [参数值...]"); // 替换为实际参数
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {}
}

2. Logback 日志格式配置

logback-spring.xml 中定义日志格式,确保 SQL 和参数清晰显示:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 显示时间、线程、日志级别、类名、消息 -->
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- MyBatis-Plus SQL 日志配置 -->
    <logger name="com.baomidou.mybatisplus" level="DEBUG"/>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

3. 验证输出格式

执行数据库操作后,日志将显示类似以下内容:

12:34:56.789 [main] DEBUG c.b.mybatisplus.core.override.MybatisMapperMethod - 
==>  Preparing: SELECT * FROM user WHERE id = ? AND name = ?
==> Parameters: 1(Integer), "John"(String)
<==      Total: 1

4. 参数显示增强(可选)

若需将参数单独显示为列表,需通过自定义拦截器捕获参数并格式化输出:

// 在拦截器中获取参数示例(需结合 MyBatis 上下文)
Object target = invocation.getTarget();
BoundSql boundSql = ... // 通过 MyBatis 上下文获取
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
Object parameterObject = ... // 获取参数对象
for (ParameterMapping mapping : parameterMappings) {
    String propertyName = mapping.getProperty();
    Object value = ... // 从 parameterObject 获取值
    logger.debug("Parameter {}: {}", propertyName, value);
}

5. 完整配置示例

application.properties
# 启用 SQL 日志和参数显示
logging.level.com.baomidou=DEBUG
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
logback-spring.xml
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.baomidou.mybatisplus" level="DEBUG"/>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
MyBatisPlusConfig.java
@Configuration
public class MyBatisPlusConfig {
    // 使用默认拦截器
    @Bean
    publicInterceptor loggingInterceptor() {
        return new LoggingInterceptor();
    }

    // 或使用自定义拦截器
    @Bean
    publicInterceptor customInterceptor() {
        return new CustomLoggingInterceptor();
    }
}

关键点总结

  1. 参数显示依赖

    • mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl 是关键配置,确保参数值被记录。
    • 默认拦截器 LoggingInterceptor 已支持参数显示,但需确保日志级别为 DEBUG
  2. 自定义拦截器

    • 若需更灵活的参数格式化(如单独列出参数),需通过拦截器捕获 BoundSql 并记录。
  3. Logback 配置

    • 日志格式需包含 %msg%n 以显示完整的 SQL 和参数信息。

常见问题

问题 解决方案
参数未显示 检查 mybatis.configuration.log-impl 是否配置正确。
日志重复输出 确保未同时启用多个拦截器(如默认和自定义拦截器)。
参数值被截断 调整日志格式的 pattern,或自定义拦截器时控制输出长度。

如需进一步优化参数格式(如 JSON 格式或过滤敏感字段),可扩展自定义拦截器逻辑。

以下是基于 **Spring Boot + Logback + MyBatis-Plus ** 的配置方案,实现输出 完整可执行的 SQL 语句(已包含参数值) 的详细步骤:


1. 核心配置步骤

1.1 设置日志级别为 DEBUG

application.properties 中开启 MyBatis 和 MyBatis-Plus 的 SQL 日志输出:

# 启用 SQL 日志(包含参数值)
logging.level.com.baomidou=DEBUG
logging.level.root=INFO
# 启用 MyBatis 参数日志
logging.level.org.apache.ibatis=DEBUG
2. 配置 MyBatis 的日志实现

确保 MyBatis 使用 SLF4J 作为日志门面,以捕获完整的 SQL 和参数:

mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
3. 添加 MyBatis-Plus 日志拦截器

在 MyBatis-Plus 配置类中添加 LoggingInterceptor,确保 SQL 和参数被记录:

@Configuration
public class MyBatisPlusConfig {
    @Bean
    publicInterceptor loggingInterceptor() {
        return new LoggingInterceptor();
    }
}

2. Logback 日志格式配置

logback-spring.xml 中定义日志格式,确保 SQL 和参数清晰显示:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 显示时间、线程、日志级别、类名、消息 -->
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- MyBatis-Plus 和 MyBatis 的 SQL 日志配置 -->
    <logger name="com.baomidou.mybatisplus" level="DEBUG"/>
    <logger name="org.apache.ibatis" level="DEBUG"/>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

3. 验证输出结果

执行数据库操作后,日志将显示完整的 SQL 语句(已替换参数值),例如:

12:34:56.789 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler - 
==>  Preparing: SELECT * FROM user WHERE id = ? AND name = ?
12:34:56.790 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler - 
==> Parameters: 1(Integer), "John"(String)
12:34:56.800 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler - 
==> SQL (executed): SELECT * FROM user WHERE id = 1 AND name = 'John'

4. 关键配置说明

4.1 org.apache.ibatis 日志级别
  • 设置 logging.level.org.apache.ibatis=DEBUG 可捕获 MyBatis 的原始日志,包括:
    • Preparing: SQL 语句(带占位符)。
    • Parameters: 参数值列表。
    • SQL (executed): 替换参数后的完整可执行 SQL(需 MyBatis 内部实现支持)。
4.2 MyBatis 的 Slf4jImpl
  • mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl 确保 MyBatis 的日志通过 SLF4J 输出,与 Logback 集成。
4.3 自动替换参数的条件

MyBatis 默认不会直接输出替换后的完整 SQL,但通过以下方式间接实现:

  • Parameters 日志:显示参数值。
  • 手动拼接:通过日志中的 PreparingParameters 信息,可人工拼接出完整 SQL。

5. 完整配置示例

application.properties
# 启用 SQL 日志和参数显示
logging.level.com.baomidou=DEBUG
logging.level.org.apache.ibatis=DEBUG
mybatis.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
logback-spring.xml
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- MyBatis 和 MyBatis-Plus 日志配置 -->
    <logger name="com.baomidou.mybatisplus" level="DEBUG"/>
    <logger name="org.apache.ibatis" level="DEBUG"/>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>
MyBatisPlusConfig.java
@Configuration
public class MyBatisPlusConfig {
    @Bean
    publicInterceptor loggingInterceptor() {
        return new LoggingInterceptor();
    }
}

6. 输出结果示例

执行查询后,日志将显示:

2023-10-01 12:34:56.789 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler - 
==>  Preparing: SELECT * FROM user WHERE id = ? AND name = ?

2023-10-01 12:34:56.790 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler - 
==> Parameters: 1(Integer), "John"(String)

2023-10-01 12:34:56.800 [main] DEBUG org.apache.ibatis.executor.statement.RoutingStatementHandler - 
==> Batching the following statement: 
SELECT * FROM user WHERE id = 1 AND name = 'John'

7. 注意事项

  1. 参数值的拼接
    MyBatis 默认不会直接输出替换后的完整 SQL,但通过 PreparingParameters 日志可人工拼接出完整 SQL。

  2. 性能影响
    开启 DEBUG 级别日志会增加日志量,建议仅在开发/测试环境启用。

  3. 敏感数据过滤
    若需隐藏敏感参数(如密码),可在拦截器中过滤日志输出。


总结

通过上述配置,可以捕获到 MyBatis 的原始日志,结合 PreparingParameters 信息,即可得到完整的可执行 SQL 语句。若需直接输出替换后的 SQL,需自定义拦截器捕获 BoundSql 对象并记录完整 SQL。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐