使用mybatis拦截器日志打印sql执行时间(yml配置开关)

本文介绍了如何使用SpringAOP在YML配置中启用SQL监控功能,通过SqlStatementInterceptor拦截器记录并分析SQL执行时间,根据耗时范围提供不同级别的日志输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.yml配置开关

monitoring:
  sql : true

2.拦截器实现

/**
 * @author qujingye
 * @Classname SqlStatementInterceptor
 * @Description sql时间监控
 * @Date 2024/4/3 14:56
 */
@Intercepts({
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class
        }),
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class,
                Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class})})
@Component
@ConditionalOnProperty(prefix = "monitoring", name = "sql", havingValue = "true")
public class SqlStatementInterceptor implements Interceptor {
    private static final Logger log = LoggerFactory.getLogger(SqlStatementInterceptor.class);

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        long startTime = System.currentTimeMillis();
        try {
            return invocation.proceed();
        } finally {
            long timeConsuming = System.currentTimeMillis() - startTime;
            log.info("执行SQL:{}ms", timeConsuming);
            if (timeConsuming > 999 && timeConsuming < 5000) {
                log.info("执行SQL大于1s:{}ms", timeConsuming);
            } else if (timeConsuming >= 5000 && timeConsuming < 10000) {
                log.info("执行SQL大于5s:{}ms", timeConsuming);
            } else if (timeConsuming >= 10000) {
                log.info("执行SQL大于10s:{}ms", timeConsuming);
            }
        }
    }

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

    @Override
    public void setProperties(Properties properties) {
        Interceptor.super.setProperties(properties);
    }
}

3.知识点补充

  • @ConditionalOnClass:当类路径上存在指定的类时创建Bean。
  • @ConditionalOnMissingClass:当类路径上不存在指定的类时创建Bean。
  • @ConditionalOnProperty:基于指定的配置属性是否存在及其值来创建Bean。
  • @ConditionalOnBean:当存在指定的Bean时创建Bean。
  • @ConditionalOnMissingBean:当不存在指定的Bean时创建Bean。
  • @ConditionalOnResource:当指定的资源存在时创建Bean
@Configuration  
public class MyConfiguration {  
  
    @Bean  
    @Conditional(MyCondition.class)  
    public MyBean myBean() {  
        return new MyBean();  
    }  
}

 📝结束语:
总结不易😄觉得有用的话,还请各位大佬动动发财的小手
给小瞿扣个三连:⛳️ 点赞⭐️收藏 ❤️ 关注
这个对我真的非常重要,拜托啦!
本人水平有限,如有纰漏,欢迎各位大佬评论指正!💞

<think>嗯,用户想了解如何配置MyBatis-Plus的日志打印。首先,我需要回忆一下相关的配置方法。记得MyBatis-Plus可以通过配置文件来开启SQL日志打印,比如在application.properties或者application.yml里设置。 根据引用[1]和[4],用户需要在配置文件中指定日志实现类。对于properties文件,添加mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl。而yml文件则是配置mybatis-plus下的configuration.log-impl为同样的类名。这两个方法应该能直接在控制台输出SQL语句,包括参数和执行SQL,这样用户就能看到具体的执行情况了。 另外,引用[4]还提到了使用Logback进行更详细的日志配置。比如,在logback-spring.xml里设置mapper包的日志级别为DEBUG,这样可以捕获更详细的信息。用户如果已经有Logback的配置,可能需要调整日志级别,确保MyBatis的mapper接口日志被正确输出。 还要注意Spring Boot本身的日志级别设置,引用[4]中提到在application.yml里设置logging.level.root为INFO,但可能需要将特定的mapper包设为DEBUG。比如logging.level.com.example.mapper=DEBUG,这样才能显示SQL日志。 另外,用户可能遇到配置不生效的问题,这时候需要检查配置位置是否正确,依赖是否冲突,或者是否有多余的配置覆盖了设置。比如同时存在properties和yml文件时,可能会有冲突,需要确保配置统一。 最后,逻辑删除或其他插件是否影响日志输出?引用[3]提到逻辑删除的配置,但应该不影响日志打印。不过如果有其他插件或自定义拦截器,可能需要检查它们的日志处理。 总结下来,配置方法主要包括配置文件设置日志实现类、调整日志级别,以及处理可能的配置冲突。需要把这些步骤清晰地告诉用户,并解答可能遇到的问题。</think>### MyBatis-Plus 日志打印配置方法 MyBatis-Plus 的日志打印功能主要用于输出 SQL 语句和执行参数,便于调试和性能优化。以下是具体配置方法: --- #### **1. 配置文件开启 SQL 日志** 在 `application.properties` 或 `application.yml` 中添加以下配置: **application.properties** ```properties # 使用标准输出打印 SQL 日志 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl ``` **application.yml** ```yaml mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl ``` 配置后,控制台会输出如下格式的 SQL 日志: ```sql ==> Preparing: SELECT id, name FROM user WHERE deleted = 0 ==> Parameters: ``` 此方法直接打印 SQL 语句和参数,适合快速调试[^1][^2]。 --- #### **2. 结合 Logback 配置详细日志** 若需更详细的日志记录(如执行时间、结果集),可结合 Logback 配置: **logback-spring.xml** ```xml <configuration> <!-- 定义日志格式 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 设置 MyBatis Mapper 接口的日志级别为 DEBUG --> <logger name="com.example.mapper" level="DEBUG" additivity="false"> <appender-ref ref="STDOUT"/> </logger> </configuration> ``` 需确保 `com.example.mapper` 替换为实际 Mapper 接口的包路径[^4]。 --- #### **3. Spring Boot 日志级别调整** 在 `application.yml` 中设置全局或特定包日志级别: ```yaml logging: level: root: INFO org.mybatis: DEBUG # MyBatis 核心日志 com.baomidou.mybatisplus: DEBUG # MyBatis-Plus 日志 ``` 此配置可输出 MyBatis-Plus 内部处理逻辑(如插件、分页等)的详细信息。 --- #### **4. 常见问题排查** - **配置不生效**:检查配置文件名是否正确(如 `application.yml` 需为 UTF-8 编码)。 - **依赖冲突**:确保未引入其他日志框架(如 Log4j)覆盖默认配置。 - **逻辑删除干扰**:若启用了逻辑删除(`@TableLogic`),需检查 SQL 中是否包含 `deleted` 字段[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小瞿码上有

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值