要使用 log4j
或 slf4j
记录 MyBatis 的 SQL 执行日志,我们可以按照以下步骤进行配置。核心思想是让 MyBatis 把它生成的 SQL 和执行参数打印到日志系统里。
一、确认日志实现
MyBatis 本身不依赖具体的日志框架,而是通过 SLF4J 统一接口。你可以选择以下任意一种实现:
- slf4j + logback
- slf4j + log4j
- slf4j + log4j2
- 甚至直接使用 log4j(不推荐)
确保项目中包含必要的依赖(以 Maven 为例):
使用 SLF4J + log4j2 示例:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.20.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.20.0</version>
</dependency>
二、配置 MyBatis 的日志实现
在 mybatis-config.xml
中加入如下配置:
<configuration>
<settings>
<!-- 使用 SLF4J 作为日志实现 -->
<setting name="logImpl" value="SLF4J"/>
</settings>
</configuration>
其他可选值包括:LOG4J
, LOG4J2
, STDOUT_LOGGING
, COMMONS_LOGGING
, NO_LOGGING
三、配置 log4j2.xml 日志级别
创建或修改 log4j2.xml
(放在 resources/
目录):
<?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>
<!-- 打印 MyBatis SQL 日志 -->
<Logger name="org.apache.ibatis" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!-- 打印 JDBC 参数 -->
<Logger name="org.mybatis" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!-- 你可以额外加上数据库驱动日志,如: -->
<Logger name="java.sql.Connection" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="java.sql.Statement" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="java.sql.PreparedStatement" level="DEBUG" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
四、效果预期
设置完成后,控制台将会输出类似以下日志:
==> Preparing: SELECT * FROM user WHERE id = ?
==> Parameters: 123(Integer)
<== Total: 1
这就包括了:
- 执行的 SQL
- 参数值及类型
- 返回结果数量
补充:打印更详细 SQL 的方式
如果还想看到完整 SQL(已填参数)。可以集成如下工具:
- 使用 p6spy:拦截 JDBC 层面 SQL,打印完整拼接后的语句。
- 自定义拦截器或实现 MyBatis 的
Log
接口:更高级控制。