java全家桶之20:spring mybatis 如何打印sql日志
- Mapper接口包路径 -->url: jdbc:p6spy:mysql://localhost:3306/db# 原URL前加 `jdbc:p6spy:`com.example.mapper: DEBUG# 打印Mapper接口的SQL日志。-- 打印JDBC原始SQL(包含参数) -->-- 打印MyBatis的SQL日志 -->-- 打印JDBC结果(可选) -->
在 Spring Boot + MyBatis 项目中,打印 SQL 日志主要有以下几种方式,根据需求选择合适的方法:
方法 1:通过 application.yml
/application.properties
配置
(推荐)直接启用 MyBatis 日志
yaml
复制
下载
# application.yml mybatis: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 直接输出到控制台
或指定日志框架(如 SLF4J + Logback):
yaml
复制
下载
logging: level: # 包路径根据你的Mapper接口所在包修改 com.example.mapper: DEBUG # 打印Mapper接口的SQL日志
方法 2:日志框架配置(Logback/SLF4J)
在 logback-spring.xml
中配置:
xml
复制
下载
运行
<!-- 打印MyBatis的SQL日志 --> <logger name="com.example.mapper" level="DEBUG"/> <!-- Mapper接口包路径 --> <!-- 打印JDBC原始SQL(包含参数) --> <logger name="jdbc.sqlonly" level="DEBUG"/> <!-- 打印JDBC结果(可选) --> <logger name="jdbc.sqltiming" level="INFO"/>
方法 3:通过 MyBatis 拦截器打印完整 SQL
如果需要看到 带参数的真实 SQL(而非占位符 ?
),可添加以下配置:
java
复制
下载
@Configuration public class MyBatisConfig { @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> { configuration.setLogImpl(org.apache.ibatis.logging.stdout.StdOutImpl.class); // 启用MyBatis的SQL日志打印 configuration.setLogPrefix("MYBATIS-SQL:"); }; } }
方法 4:打印 PreparedStatement 的完整 SQL
在 application.yml
中启用 JDBC 日志(需依赖 p6spy
或 log4jdbc
):
使用 p6spy(推荐)
-
添加依赖:
xml
复制
下载
运行
<dependency> <groupId>p6spy</groupId> <artifactId>p6spy</artifactId> <version>3.9.1</version> </dependency>
-
修改数据源配置:
yaml
复制
下载
spring: datasource: url: jdbc:p6spy:mysql://localhost:3306/db # 原URL前加 `jdbc:p6spy:` driver-class-name: com.p6spy.engine.spy.P6SpyDriver
-
创建
spy.properties
:properties
复制
下载
module.log=com.p6spy.engine.logging.P6LogFactory appender=com.p6spy.engine.spy.appender.StdoutLogger logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
方法 5:动态开启日志(无需重启)
通过 Actuator 动态调整日志级别(需依赖 spring-boot-actuator
):
-
添加依赖:
xml
复制
下载
运行
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
-
发送请求修改日志级别:
bash
复制
下载
curl -X POST http://localhost:8080/actuator/loggers/com.example.mapper \ -H "Content-Type: application/json" \ -d '{"configuredLevel":"DEBUG"}'
效果对比
方法 | 输出内容 | 优点 | 缺点 |
---|---|---|---|
方法1/2 | SELECT * FROM user WHERE id=? |
简单易用 | 参数用? 占位,不直观 |
方法3 | 完整SQL(控制台输出) | 无需额外依赖 | 日志格式较原始 |
方法4(p6spy) | SELECT * FROM user WHERE id=1 |
真实SQL,带参数值 | 需修改数据源URL |
常见问题
-
日志不打印?
-
检查包路径是否正确(与Mapper接口包一致)。
-
确保没有其他日志框架冲突(如同时存在Logback和Log4j2)。
-
-
输出太多无关日志?
-
精确指定Mapper包路径,避免全局
DEBUG
。
-
-
生产环境注意事项
-
避免长期开启
DEBUG
级别日志,建议通过Actuator动态开启。
-
选择最适合你的场景的方式即可!
更多推荐
所有评论(0)