Mybatis 中将 SQL 查询记录到控制台

MyBatis是一个流行的基于 Java 的持久性框架,它通过将 SQL 查询映射到 Java 方法来简化数据库操作。

使用 MyBatis 开发应用程序时,调试以查看正在使用哪些 SQL 查询通常很有用。

在本教程中,我们将探讨如何将 SQL 查询记录到 MyBatis 中的控制台。

支持的日志记录实现
在深入研究 MyBatis 中的 SQL 日志记录之前,了解支持的日志记录实现非常重要。

MyBatis 是一个灵活的框架,可以与各种日志框架集成,包括SLF4J、Apache Commons Logging、Log4j 2和JDK Logging。本文将探讨两种不同的日志记录选项:stdout 日志记录和 SLF4J。

标准输出日志记录在本地功能开发期间非常有用,因为它提供了一种简单的调试方法。另一方面,SLF4J 更适合生产应用程序,提供多功能抽象,可在部署期间与用户首选的日志框架无缝集成。

在 MyBatis 中配置 Stdout 日志记录
使用stdout记录MyBatis SQL可以让我们直接在控制台查看执行的SQL语句。这种方法在开发和调试时非常方便。

要为 MyBatis SQL 启用 stdout 日志记录,我们需要在应用程序的mybatis-config文件中添加日志记录设置:

<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

将logImpl属性配置为STDOUT_LOGGING后,MyBatis 在执行 SQL 查询时将输出原始 SQL 语句、查询参数和查询结果。输出通常包括执行的 SQL、绑定参数和返回的结果集等详细信息:

==>  Preparing: SELECT addressId, streetAddress FROM Address WHERE addressId = ? 
==> Parameters: 1(Integer)
<==    Columns: ADDRESSID, STREETADDRESS
<==        Row: 1, 123 Main Street

输出指示准备 SQL 查询以使用特定 ID从Address表中获取数据。它显示参数、结果集列(ADDRESSID和STREETADDRESS)以及说明性数据行(ADDRESSID: 1, STREETADDRESS: 123 Main Street)。此外,它还告诉我们返回的行总数为 1。

除了在mybatis-config中配置logImpl属性之外,我们还可以选择以编程方式设置日志实现。我们可以通过在调用任何其他 MyBatis 方法之前调用静态方法LogFactory.useStdOutLogging()来实现此目的。

使用stdout 日志记录有一个缺点,因为它缺乏对日志的细粒度控制。通过 stdout 日志记录,MyBatis 会详细记录所有执行的 SQL 查询,这可能会令人难以承受,并且很难专注于基本信息。

为了实现对日志记录的更精确控制,例如确定哪个部分或映射器打印日志,建议使用日志记录框架。

.在MyBatis中配置SLF4J和Logback日志记录
1.设置 SLF4J 和 Logback 日志记录
首先,我们需要将 SLF4J 和 Logback 依赖项添加到项目的构建文件中。由于Logback自动包含SLF4J作为传递依赖,因此对于Maven项目,我们只需要在pom.xml文件中指定Logback依赖:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.4.14</version>
</dependency>

接下来,我们需要创建一个 Logback 配置文件(通常名为logback.xml)来定义日志记录行为:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
    <appender name=
"stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%5level [%thread] - %msg%n</pattern>
        </encoder>
    </appender>
    <root level=
"INFO">
        <appender-ref ref=
"stdout"/>
    </root>
</configuration>

此配置创建一个根记录器来记录日志级别为 INFO 或更高的消息,并将它们定向到stdout附加程序以输出到控制台。

接下来,与 stdout 日志配置类似,我们需要在mybatis-config文件中将logImpl属性设置为 SLF4J :

<configuration>
    <settings>
        <setting name="logImpl" value="SLF4J" />
    </settings>
</configuration>

2.测井映射器
通过如上所述配置日志记录,记录映射器变得简单。我们可以将记录器名称设置为映射器接口的完全限定名称,或者如果使用 XML 映射器文件则为命名空间:

<logger name="com.baeldung.mybatis.mapper.AddressMapper" level="TRACE"/>

通过将记录器与所需的映射器相关联,可以轻松进行记录控制。只有与此映射器相关的查询才会应用跟踪级别日志记录。

3.记录特定映射器方法
要选择性地记录特定方法的执行,例如 FruitMapper 中的 getFruitById,我们可以相应地配置记录器:

<logger name="com.baeldung.mybatis.mapper.AddressMapper.getAddresses" level="TRACE"/>

通过此配置,记录器仅在执行getFruitById方法时将日志打印到控制台 ,从而允许更集中和更精细的日志记录控制。

4.在包中记录映射器
通过将记录器名称设置为包名称,我们可以轻松地为特定包下的所有映射器启用日志记录:

<logger name="com.baeldung.mybatis.mapper" level="TRACE"/>

这种方法允许在指定包内的所有映射器上进行全面的日志记录。

5.仅记录 SQL 语句
在查询可能产生大量结果集的场景中,我们可能更愿意查看 SQL 语句而不记录实际结果。 MyBatis 被设计为在 DEBUG 级别记录 SQL 语句,而在 TRACE 级别记录结果。如果我们希望看到没有结果的语句,我们需要将日志记录级别设置为 DEBUG:

<logger name="com.baeldung.mybatis.mapper.AddressMapper" level="DEBUG"/>

使用 Spring Boot 在 MyBatis 中配置 SQL 日志记录
Spring 是一个被广泛采用的框架,在很多情况下,MyBatis 是与 Spring 结合配置的,而不是单独使用。使用Spring Boot时,几乎不需要配置 MyBatis SQL 日志记录。Spring Boot 使用 logback 作为其默认日志记录实现,而 MyBatis 的日志记录机制优先考虑 SLF4J。

因此,要为特定映射器启用 MyBatis SQL 日志记录,我们将属性添加到 Spring Boot application.properties文件中:

logging.level.com.baeldung.mybatis.spring.ArticleMapper=DEBUG

通过将指定映射器的日志级别配置为DEBUG ,我们将获得该特定映射器的详细 SQL 日志记录。