要看到mybatis带真实参数的完整sql,需将org.apache.ibatis.logging.jdbc.basejdbclogger日志级别设为debug,并确保slf4j绑定支持debug的日志实现(如logback),避免日志被根节点拦截或绑定冲突。

MyBatis 默认不打印完整 SQL(带参数值),只输出预编译语句(如 SELECT * FROM user WHERE id = ?),调试时根本看不出实际执行的是哪条 SQL。要看到带真实参数的完整 SQL,不能只靠 IDEA 自带的日志高亮,得从 MyBatis 日志机制本身入手——核心是让日志框架把 org.apache.ibatis.logging.jdbc.BaseJdbcLogger 的 DEBUG 级别日志打出来,并确保参数被真实渲染。
确认项目使用的日志实现(SLF4J + Logback / Log4j2?)
MyBatis 通过 org.apache.ibatis.logging.LogFactory 桥接日志,最终取决于 classpath 下存在的日志绑定。IDEA 里跑 Spring Boot 项目,默认多为 Logback(logback-spring.xml 或 logback.xml);若用 Log4j2,则需对应配置 log4j2.xml。插件或 IDEA 控制台日志是否可见,首先取决于这个底层日志框架是否启用了 MyBatis 相关包的 DEBUG 级别。
- 检查
resources/下是否存在logback-spring.xml或logback.xml;没有则新建一个最简版 - 如果用 Maven 引入了
spring-boot-starter-log4j2,就别配 Logback,否则可能冲突 - Spring Boot 2.4+ 默认禁用 Log4j2 的自动发现,若强行用 Log4j2,需在
application.properties加logging.config=classpath:log4j2.xml
配置 Logback 输出完整 SQL(含参数值)
关键不是改 org.mybatis.spring,而是 MyBatis 内部 JDBC 日志器:它会在执行 PreparedStatement 后,用 BaseJdbcLogger 的 debug 方法拼出完整 SQL。必须让该类的日志级别为 DEBUG,且日志内容不被过滤。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
在 logback-spring.xml 中添加:
<logger name="org.apache.ibatis.logging.jdbc.BaseJdbcLogger" level="DEBUG"></logger>
- 不要写成
org.apache.ibatis(太宽泛,会刷屏),也不要写成org.apache.ibatis.mapping(不打 SQL) - 如果用了 Druid 或 Hikari 连接池,它们也有自己的 SQL 日志开关(如
druid.stat.logEnabled=true),但那是另一层,和 MyBatis 渲染无关 - 确保 root logger 至少是 INFO 级,否则 DEBUG 日志会被根节点拦截掉
验证 SQL 是否真带参数值(常见假成功)
很多人配完发现控制台出现 ==> Preparing: SELECT * FROM user WHERE id = ? 和 ==> Parameters: 123(Integer) 两行,误以为成功——其实这还不是“完整 SQL”。真正想要的是 SELECT * FROM user WHERE id = 123 这种单行可直接复制执行的语句。
- MyBatis 官方不提供“拼接后 SQL”的原生日志输出;
BaseJdbcLogger的 DEBUG 日志默认就是分两行(SQL 模板 + 参数映射) - 若坚持要单行完整 SQL,可用
p6spy替换 JDBC 驱动(需改url、加p6spy依赖、配spy.properties),但它属于代理层,和 MyBatis 日志无关 - 更轻量的办法:用 IDEA 的「Evaluate Expression」在断点处调用
boundSql.getBoundSql(parameterObject),手动看渲染结果
最易忽略的一点:MyBatis 的日志输出依赖于 Configuration.logImpl 的实际实现类,而这个类由 LogFactory 根据 classpath 推断。哪怕你写了 logback.xml,如果项目里同时存在 slf4j-simple 和 logback-classic,SLF4J 可能绑定到 simple 实现(它不支持 DEBUG 级别配置),导致日志完全不输出——务必检查 Maven 依赖树,排除冲突绑定。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










