全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

SQL 日志输出

配置好日志框架后,核心需求是看到 MyBatis 执行的 SQL 语句、传入的参数以及返回结果。本文介绍如何通过日志级别精准控制输出内容。

日志级别与输出内容

MyBatis 使用不同的 Logger 名称和日志级别来控制输出:

Logger 名称日志级别输出内容
com.example.mapper.UserMapperDEBUGSQL 语句 + 参数值
com.example.mapper.UserMapperTRACESQL 语句 + 参数值 + 结果集
org.apache.ibatis.transactionDEBUG事务提交/回滚信息
org.apache.ibatis.datasourceDEBUG连接池获取/归还信息

注意: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
操作类型结果标识含义
SELECTTotal: N返回 N 行数据
INSERTUpdates: N影响 N 行(通常为 1)
UPDATEUpdates: N更新 N 行
DELETEUpdates: 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

📝 发现内容有误?点击此处直接编辑

← 上一篇 条件更新与删除
下一篇 → 开发调试技巧
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库