一、单独使用 MyBatis(原生)如何开启日志
步骤 1:引入日志依赖(以 Log4j2 为例)
MyBatis 本身不包含日志实现,需自行引入。推荐使用 Log4j2 或 SLF4J + Logback。
Maven 依赖(Log4j2):
<dependencies>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<!-- Log4j2 核心 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<!-- Log4j2 API -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
</dependencies>
⚠️ 不要引入
slf4j相关依赖,避免日志桥接冲突(除非你明确使用 SLF4J)。
步骤 2:配置日志文件(log4j2.xml)
在 src/main/resources 下创建 log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<!-- 关键:将你的 Mapper 接口所在包设为 DEBUG 级别 -->
<Logger name="com.example.mapper" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
✅
name="com.example.mapper"必须替换为你实际的 Mapper 接口包路径!
步骤 3:确保 MyBatis 能识别日志实现
MyBatis 会自动探测已引入的日志框架。只要正确引入了 Log4j2 依赖,无需额外配置。
可选:强制指定日志实现(一般不需要)
System.setProperty("org.apache.ibatis.logging.LogFactory", "org.apache.ibatis.logging.log4j2.Log4j2Impl");
效果验证
运行以下代码:
try (SqlSession session = MyBatisUtil.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.findById(1);
System.out.println(user);
}
控制台将输出:
15:30:22.123 [main] DEBUG c.e.m.UserMapper.findById - ==> Preparing: SELECT id, username, email FROM user WHERE id = ?
15:30:22.150 [main] DEBUG c.e.m.UserMapper.findById - ==> Parameters: 1(Integer)
15:30:22.180 [main] DEBUG c.e.m.UserMapper.findById - <== Total: 1
二、Spring Boot 中如何开启 MyBatis 日志
Spring Boot 默认使用 SLF4J + Logback,配置极其简单。
步骤 1:确认依赖
确保已引入 mybatis-spring-boot-starter:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
该 starter 已自动引入 SLF4J 和 Spring Boot 日志支持。
步骤 2:配置 application.yml
在 application.yml 中设置 Mapper 接口包的日志级别为 debug:
logging:
level:
# 替换为你的 Mapper 接口所在包
com.example.mapper: debug
✅ 无需配置 logback.xml,除非有特殊格式需求。
效果验证
调用 Service 方法:
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/user/{id}")
public User getUser(@PathVariable Integer id) {
return userMapper.findById(id); // 自动输出 SQL 日志
}
}
控制台输出:
2025-11-20 15:40:00.123 DEBUG 12345 --- [nio-8080-exec-1] c.e.m.UserMapper.findById : ==> Preparing: SELECT id, username, email FROM user WHERE id = ?
2025-11-20 15:40:00.150 DEBUG 12345 --- [nio-8080-exec-1] c.e.m.UserMapper.findById : ==> Parameters: 1(Integer)
2025-11-20 15:40:00.180 DEBUG 12345 --- [nio-8080-exec-1] c.e.m.UserMapper.findById : <== Total: 1
三、对比总结
| 项目 | 原生 MyBatis | Spring Boot + MyBatis |
|---|---|---|
| 日志框架 | 需手动引入(Log4j2/Logback) | 自动使用 SLF4J + Logback |
| 配置方式 | 编写 log4j2.xml 或 logback.xml |
在 application.yml 中设置 logging.level |
| 关键配置项 | <Logger name="mapper包路径" level="debug"> |
logging.level.com.your.mapper=debug |
| 是否需要额外代码 | 否(依赖自动探测) | 否 |
| 推荐场景 | 独立工具、非 Spring 项目 | Web 应用、微服务 |
四、常见问题
Q1:为什么设置了日志级别还是看不到 SQL?
- 检查包路径是否完全匹配(区分大小写)
- 确认是 Mapper 接口的包路径,不是 XML 文件路径
- 原生项目检查是否引入了正确的日志实现依赖
Q2:能否只打印 SQL 不打印结果?
可以,降低 ResultSetHandler 日志级别:
# Spring Boot
logging:
level:
com.example.mapper: debug
org.apache.ibatis.executor.resultset: warn
Q3:生产环境是否应关闭?
强烈建议关闭:
# application-prod.yml
logging:
level:
com.example.mapper: info # 或 warn/error
避免性能损耗和敏感信息泄露。
结语
无论是原生 MyBatis 还是 Spring Boot 集成,开启 SQL 日志的核心都是:将 Mapper 接口所在包的日志级别设为 DEBUG。