要使用 log4jslf4j 记录 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 接口:更高级控制。