在SpringBoot项目开发中,日志功能是必不可少的基础组件。特别是在使用MyBatis/MyBatisPlus进行数据库操作时,开启SQL日志可以帮助开发者快速定位问题、优化查询性能。本文将详细介绍如何在SpringBoot3项目中为MyBatisPlus配置标准输出日志,并深入解析日志功能的实现原理和实用技巧。
作为一名长期使用MyBatisPlus的开发人员,我发现很多新手在配置日志时容易忽略一些关键细节。比如不知道如何选择日志实现类、不清楚日志输出的具体含义、或者遇到日志不生效的情况时无从下手。本文将基于实际项目经验,带你完整走通从配置到验证的全流程。
在开始配置日志功能前,我们需要确保已经有一个可运行的SpringBoot3项目,并且已经集成了MyBatisPlus。如果你还没有基础项目,可以参考以下步骤:
使用Spring Initializr创建项目,选择:
基础pom.xml依赖示例:
xml复制<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
MyBatisPlus的日志功能依赖于MyBatis的核心日志模块。在SpringBoot项目中,这些依赖通常会被自动引入,但为了确保万无一失,我们可以手动检查:
提示:如果发现依赖冲突(比如同时存在MyBatis和MyBatisPlus的不同版本),需要统一版本号以避免不可预知的问题。
MyBatis支持多种日志实现方式,常见的包括:
在开发阶段,我们通常使用StdOutImpl将SQL直接输出到控制台,便于调试。这个类位于MyBatis的核心包中,完整路径为:org.apache.ibatis.logging.stdout.StdOutImpl
在SpringBoot的application.yml中添加如下配置:
yaml复制mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
这个配置告诉MyBatisPlus使用标准输出作为日志实现。配置生效后,你将在控制台看到如下格式的SQL日志:
code复制==> Preparing: SELECT * FROM user WHERE id = ?
==> Parameters: 1(Integer)
<== Columns: id, name, age
<== Row: 1, John, 30
<== Total: 1
如果你使用的是application.properties文件,可以这样配置:
properties复制mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
除了配置日志实现类,我们还可以通过SpringBoot的日志级别设置来控制MyBatis日志的详细程度:
yaml复制logging:
level:
org.mybatis: DEBUG
com.baomidou.mybatisplus: DEBUG
配置完成后,可以通过以下方式验证日志功能是否生效:
典型的成功输出应该包含三部分:
让我们详细解析一段实际的日志输出:
code复制2023-05-20 14:30:22.456 DEBUG 12345 --- [nio-8080-exec-1] c.b.m.c.MybatisMapperProxy : ==> Preparing: SELECT id,name,email FROM user WHERE age > ?
2023-05-20 14:30:22.457 DEBUG 12345 --- [nio-8080-exec-1] c.b.m.c.MybatisMapperProxy : ==> Parameters: 18(Integer)
2023-05-20 14:30:22.463 DEBUG 12345 --- [nio-8080-exec-1] c.b.m.c.MybatisMapperProxy : <== Total: 3
如果日志没有按预期输出,可以按照以下步骤排查:
确认配置是否正确:
检查依赖冲突:
mvn dependency:tree查看依赖关系检查日志级别:
验证Mapper调用:
虽然StdOutImpl适合开发环境,但在生产环境中建议使用更专业的日志方案:
yaml复制mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
配合Logback或Log4j2配置文件,可以实现:
如果SQL中包含敏感信息(如密码),可以自定义日志插件实现脱敏:
java复制@Intercepts({
@Signature(type= StatementHandler.class, method="query", args={Statement.class, ResultHandler.class}),
@Signature(type= StatementHandler.class, method="update", args={Statement.class}),
@Signature(type= StatementHandler.class, method="batch", args={Statement.class})
})
public class SensitiveInfoInterceptor implements Interceptor {
// 实现敏感信息过滤逻辑
}
通过自定义拦截器,可以记录SQL执行时间,用于性能分析:
java复制public class PerformanceInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
long start = System.currentTimeMillis();
Object result = invocation.proceed();
long end = System.currentTimeMillis();
System.out.println("SQL执行耗时:" + (end - start) + "ms");
return result;
}
}
开发环境:
测试环境:
生产环境:
日志不生效:
日志输出不全:
日志格式混乱:
对于高频查询:
大批量操作:
生产环境:
MyBatisPlus的日志系统基于MyBatis的日志模块构建,主要组件包括:
SpringBoot的日志系统通过以下方式与MyBatis集成:
这种设计使得我们可以通过SpringBoot的配置统一管理所有日志行为。
在长期使用MyBatisPlus的过程中,我发现日志配置虽然简单,但细节决定效率。合理的日志设置可以大幅提升开发调试效率,而过多的日志输出则可能掩盖真正的问题。建议根据项目阶段灵活调整日志策略,在开发初期可以详细记录所有SQL,而在系统稳定后则应聚焦于异常和性能日志。