SpringBoot3+MyBatis-Plus SQL可视化调试实战 1. 项目概述作为一名长期奋战在业务开发一线的Java工程师我深知排查SQL问题的痛苦。每次看到MyBatis日志里那一串串问号占位符都忍不住想摔键盘。手动拼接SQL参数不仅耗时耗力还容易出错想统计SQL执行耗时更是要各种加日志、查监控效率极其低下。最近在SpringBoot3项目中实践了一套SQL可视化调试方案完美解决了这些问题。这套方案的核心优势在于零侵入无需修改任何业务代码即插即用添加依赖后立即生效完整SQL展示直接输出带真实参数的SQL语句执行耗时统计自动计算每条SQL的执行时间2. 环境准备2.1 基础环境要求在开始配置前请确保你的开发环境满足以下要求SpringBoot版本3.2.5最低要求3.0ORM框架MyBatis-Plus 3.5.3数据库MySQL 8.0其他数据库也支持配置略有不同JDK版本17提示虽然方案主要针对SpringBoot3设计但经过测试在SpringBoot2.7版本也能正常工作只是部分配置项可能需要调整。2.2 开发工具建议为了获得最佳调试体验推荐使用以下工具组合IDEIntelliJ IDEA社区版即可数据库客户端DBeaver或Navicat项目构建工具Maven 3.8终端工具支持ANSI颜色的终端如Windows Terminal3. 核心依赖配置3.1 Maven依赖引入方案的核心是p6spy组件它通过代理模式拦截JDBC操作。推荐使用starter简化配置!-- SQL可视化调试核心starter -- dependency groupIdcom.github.gavlyukovskiy/groupId artifactIdp6spy-spring-boot-starter/artifactId version2.0.0/version /dependency !-- 以下是项目原有依赖检查是否已存在 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency3.2 依赖选择建议在实际项目中可能会遇到以下两种场景全新项目直接使用上述starter方案最省心已有项目改造如果原项目使用了复杂的数据源配置如多数据源可能需要手动配置对于Spring Cloud项目注意检查是否与其他数据源组件冲突踩坑记录曾经在一个多数据源项目中直接引入starter导致启动失败后来发现需要排除自动配置类。解决方案是在SpringBootApplication中添加exclude {P6SpyAutoConfiguration.class}然后手动配置。4. 详细配置指南4.1 基础配置application.ymlspring: datasource: url: jdbc:mysql://localhost:3306/your_db?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/ShanghaiuseSSLfalse username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource # 关闭MyBatis-Plus原生日志避免重复 mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl # SQL调试配置 decorator: datasource: p6spy: logging: sysout log-format: SQL执行耗时: %(executionTime)ms | 执行时间: %(currentTime) | 完整SQL: %(sql)4.2 高级配置spy.properties在resources目录下创建spy.properties文件# 日志格式化适配MyBatis-Plus logMessageFormatcom.baomidou.mybatisplus.extension.p6spy.P6SpyLogger # 日志输出到控制台 appendercom.p6spy.engine.spy.appender.StdoutLogger # 启用前缀标识 useprefixtrue # 排除无用日志类别 excludecategoriesinfo,debug,result,commit,resultset # 时间格式化 dateformatyyyy-MM-dd HH:mm:ss # 真实数据库驱动 driverlistcom.mysql.cj.jdbc.Driver # 慢SQL检测单位秒 outagedetectiontrue outagedetectioninterval24.3 配置项详解logMessageFormat默认格式较简单使用MyBatis-Plus专用格式器输出更清晰支持自定义实现可继承com.p6spy.engine.spy.appender.FormattedLoggerexcludecategories过滤掉不关心的日志类型使输出更简洁常见值info,debug,result,commit,resultset,batchoutagedetection慢SQL检测功能超过阈值的SQL会特别标注生产环境建议关闭避免性能开销5. 实战效果演示5.1 控制台输出示例SQL执行耗时: 32ms | 执行时间: 2026-03-21 15:30:22 | 完整SQL: SELECT id,username,phone FROM t_user WHERE id 1 AND status 0; SQL执行耗时: 45ms | 执行时间: 2026-03-21 15:30:30 | 完整SQL: INSERT INTO t_user(username,phone,create_time) VALUES (张三,13800138000,2026-03-21 15:30:30);5.2 功能亮点参数可视化所有?占位符都被替换为实际值字符串类型自动添加引号NULL值明确显示执行耗时精确到毫秒级包含网络往返时间可用于性能分析直接复制执行输出的SQL可直接粘贴到客户端工具执行特别适合复杂查询调试6. 生产环境管理6.1 安全注意事项绝对禁止在生产环境开启此功能原因包括日志会暴露真实数据增加性能开销可能泄露敏感信息6.2 环境隔离方案方案一Maven Profileprofiles profile iddev/id activation activeByDefaulttrue/activeByDefault /activation dependencies dependency groupIdcom.github.gavlyukovskiy/groupId artifactIdp6spy-spring-boot-starter/artifactId version2.0.0/version /dependency /dependencies /profile /profiles方案二配置开关spring: profiles: active: dev --- spring: config: activate: on-profile: prod decorator: datasource: p6spy: enable: false7. 常见问题排查7.1 驱动加载失败现象启动时报Driver not found解决方案检查driver-class-name是否正确如果手动配置确保url以jdbc:p6spy:开头推荐使用starter自动配置7.2 日志重复输出现象同一条SQL被打印多次解决方案确认关闭了MyBatis原生日志检查是否有多个数据源被代理在spy.properties中设置excludecategories7.3 性能下降明显现象启用后请求响应变慢解决方案检查是否在生产环境误开启降低日志级别考虑使用文件输出代替控制台8. 进阶使用技巧8.1 日志文件输出# 输出到文件 appendercom.p6spy.engine.spy.appender.FileLogger # 日志文件路径 logfilespy.log # 每日滚动 appender.propertieslog.dateformatyyyy-MM-dd8.2 自定义日志格式logMessageFormatcom.yourpackage.CustomLogger需要实现自定义类public class CustomLogger extends FormattedLogger { Override public String formatMessage(int connectionId, String now, long elapsed, String category, String prepared, String sql) { // 自定义格式逻辑 } }8.3 敏感数据脱敏通过自定义过滤器实现public class SensitiveFilter implements P6LogQueryFilter { Override public boolean logQuery(String query) { // 实现脱敏逻辑 return true; } }在spy.properties中注册filtercom.yourpackage.SensitiveFilter这套方案在我负责的多个项目中已经稳定运行超过半年极大提升了开发调试效率。特别是在处理复杂业务逻辑时能够快速定位SQL问题平均每个需求节省约2小时的调试时间。