MyBatis打印完整可执行SQL需结合日志配置或拦截器:DEBUG+TRACE可人工拼接参数;StdOutImpl结构清晰但含?;自定义Interceptor可输出带值、耗时、格式化的真SQL;P6Spy零侵入代理,直接捕获最终执行语句。

MyBatis 默认打印的 SQL 带有 ? 占位符,不是真正可直接执行的语句。要打印参数已替换、带具体值、格式清晰的完整 SQL,需结合日志框架配置或自定义拦截器。下面几种方式按推荐度和实用性排序:
用 Logback/Log4j 配置 DEBUG + TRACE 级别
这是最轻量、无需改代码的方式,适合开发和测试环境。
- 将 org.apache.ibatis 设为
DEBUG:输出 Mapper 方法名、预编译 SQL(含 ?) - 将 java.sql.PreparedStatement 设为
TRACE:输出实际绑定的参数值,部分日志实现会自动拼出完整 SQL
Logback 示例(logback.xml):
<logger name="org.apache.ibatis" level="DEBUG"/><br><logger name="java.sql.PreparedStatement" level="TRACE"/>
效果示例:==> Parameters: 张三(String), 25(Integer)
配合预编译 SQL SELECT * FROM user WHERE name = ? AND age > ?,人工拼接即可得到完整语句。
启用 StdOutImpl 日志实现(简单直出)
不依赖外部日志框架,适合快速验证。
立即学习“Java免费学习笔记(深入)”;
- Spring Boot 中在
application.yml加:
mybatis:<br> configuration:<br> log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
或 MyBatis 原生配置(mybatis-config.xml):
<settings><br> <setting name="logImpl" value="STDOUT_LOGGING"/><br></settings>
控制台输出类似:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
==> Preparing: SELECT id,name FROM user WHERE name = ?<br>==> Parameters: 李四(String)<br><== Total: 1
注意:仍含 ?,但结构清晰,配合参数行可手动还原。
自定义 MyBatis 拦截器(真正完整 SQL)
若必须在控制台看到 已替换参数、无占位符、带执行耗时 的 SQL(如 SELECT id,name FROM user WHERE name = '李四'),需写拦截器。
- 拦截
Executor的query和update方法 - 通过
BoundSql.getSql()获取原始 SQL - 调用
parameterObject和ParameterMapping解析并替换参数(注意类型转换,如 String 加单引号、null 处理、日期格式化) - 用
StopWatch统计耗时,格式化输出
关键输出示例:
Mapper Method: com.example.mapper.UserMapper.selectByName<br>Execute SQL: SELECT id,name FROM user WHERE name = '李四' AND status = 1<br>Spend Time: 12ms
该方式可扩展支持慢 SQL 上报、MQ 推送等,适合中大型项目统一治理。
使用 P6Spy(零侵入代理方案)
不修改代码、不写拦截器,通过 JDBC 驱动代理实现全量真实 SQL 捕获。
- Maven 引入
p6spy依赖 - 修改数据库连接 URL:把
jdbc:mysql://换成jdbc:p6spy:mysql:// - 配置
spy.properties指定日志输出路径和格式
P6Spy 输出即为最终交给数据库执行的语句,包括事务、批量操作等,且支持脱敏和过滤,生产环境灰度开启较安全。


















