SQL 日志输出
配置好日志框架后,核心需求是看到 MyBatis 执行的 SQL 语句、传入的参数以及返回结果。本文介绍如何通过日志级别精准控制输出内容。
日志级别与输出内容
MyBatis 使用不同的 Logger 名称和日志级别来控制输出:
| Logger 名称 | 日志级别 | 输出内容 |
|---|---|---|
com.example.mapper.UserMapper | DEBUG | SQL 语句 + 参数值 |
com.example.mapper.UserMapper | TRACE | SQL 语句 + 参数值 + 结果集 |
org.apache.ibatis.transaction | DEBUG | 事务提交/回滚信息 |
org.apache.ibatis.datasource | DEBUG | 连接池获取/归还信息 |
注意:Mapper 接口的 Logger 名称就是接口的全限定类名。
查看 SQL 语句和参数
将 Mapper 包设为 DEBUG 级别,即可输出 SQL 和参数:
Logback 配置
XML
<!-- logback.xml -->
<logger name="com.example.mapper" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
Spring Boot 配置
YAML
logging:
level:
com.example.mapper: DEBUG
输出示例
YAML
2026-05-20 10:30:15 [main] DEBUG c.e.mapper.UserMapper.selectById - ==> Preparing: SELECT id, username, email FROM users WHERE id = ?
2026-05-20 10:30:15 [main] DEBUG c.e.mapper.UserMapper.selectById - ==> Parameters: 1(Long)
2026-05-20 10:30:15 [main] DEBUG c.e.mapper.UserMapper.selectById - <== Total: 1
日志解读:
==>表示 SQL 准备阶段,显示预编译语句==>第二行显示实际传入的参数值<==表示执行结果,Total为返回行数
查看完整结果集
如果需要看到每一行查询结果,将日志级别提升到 TRACE:
YAML
logging:
level:
com.example.mapper: TRACE
TRACE 级别输出示例
XML
2026-05-20 10:30:15 [main] DEBUG c.e.mapper.UserMapper.selectAll - ==> Preparing: SELECT id, username, email FROM users
2026-05-20 10:30:15 [main] DEBUG c.e.mapper.UserMapper.selectAll - ==> Parameters:
2026-05-20 10:30:15 [main] TRACE c.e.mapper.UserMapper.selectAll - <== Columns: id, username, email
2026-05-20 10:30:15 [main] TRACE c.e.mapper.UserMapper.selectAll - <== Row: 1, admin, admin@example.com
2026-05-20 10:30:15 [main] TRACE c.e.mapper.UserMapper.selectAll - <== Row: 2, user1, user1@example.com
2026-05-20 10:30:15 [main] DEBUG c.e.mapper.UserMapper.selectAll - <== Total: 2
注意:TRACE 级别会逐行输出结果集,数据量大时日志体积会急剧膨胀,仅建议开发调试时临时开启。
不同操作的日志输出
INSERT 操作
text
2026-05-20 10:35:20 [main] DEBUG c.e.mapper.UserMapper.insert - ==> Preparing: INSERT INTO users (username, email) VALUES (?, ?)
2026-05-20 10:35:20 [main] DEBUG c.e.mapper.UserMapper.insert - ==> Parameters: newuser(String), newuser@example.com(String)
2026-05-20 10:35:20 [main] DEBUG c.e.mapper.UserMapper.insert - <== Updates: 1
UPDATE 操作
text
2026-05-20 10:36:10 [main] DEBUG c.e.mapper.UserMapper.updateEmail - ==> Preparing: UPDATE users SET email = ? WHERE id = ?
2026-05-20 10:36:10 [main] DEBUG c.e.mapper.UserMapper.updateEmail - ==> Parameters: updated@example.com(String), 1(Long)
2026-05-20 10:36:10 [main] DEBUG c.e.mapper.UserMapper.updateEmail - <== Updates: 1
DELETE 操作
text
2026-05-20 10:37:05 [main] DEBUG c.e.mapper.UserMapper.deleteById - ==> Preparing: DELETE FROM users WHERE id = ?
2026-05-20 10:37:05 [main] DEBUG c.e.mapper.UserMapper.deleteById - ==> Parameters: 5(Long)
2026-05-20 10:37:05 [main] DEBUG c.e.mapper.UserMapper.deleteById - <== Updates: 1
| 操作类型 | 结果标识 | 含义 |
|---|---|---|
| SELECT | Total: N | 返回 N 行数据 |
| INSERT | Updates: N | 影响 N 行(通常为 1) |
| UPDATE | Updates: N | 更新 N 行 |
| DELETE | Updates: N | 删除 N 行 |
针对性开启日志
不必全局开启 DEBUG,可按具体 Mapper 精准控制:
text
logging:
level:
# 只开启 UserMapper 的 SQL 日志
com.example.mapper.UserMapper: DEBUG
# OrderMapper 保持默认级别
com.example.mapper.OrderMapper: INFO
这种方式在多模块项目中特别有用,只关注当前正在调试的 Mapper。
日志输出格式优化
Logback 自定义输出格式,让 SQL 日志更易读:
text
<appender name="SQL_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- 简化格式:去掉线程名,突出 SQL -->
<pattern>%d{HH:mm:ss.SSS} %-5level %logger{40} - %msg%n</pattern>
</encoder>
</appender>
输出效果:
text
10:30:15.123 DEBUG c.e.mapper.UserMapper.selectById - ==> Preparing: SELECT id, username, email FROM users WHERE id = ?
10:30:15.125 DEBUG c.e.mapper.UserMapper.selectById - ==> Parameters: 1(Long)
10:30:15.130 DEBUG c.e.mapper.UserMapper.selectById - <== Total: 1
要点总结
- Mapper 接口 Logger 名称即全限定类名,设为 DEBUG 输出 SQL + 参数
- TRACE 级别额外输出逐行结果集,数据量大时谨慎使用
Total表示查询返回行数,Updates表示 DML 影响行数- 可按具体 Mapper 开启日志,避免全局 DEBUG 导致日志过多
- 优化 Logback 输出格式可提升 SQL 日志可读性
文章存放路径:articles/MYBATIS/入门/日志配置与调试/SQL 日志输出.md
📝 发现内容有误?点击此处直接编辑