Mybatis 中將 SQL 查詢記錄到控制檯

banq發表於2024-05-17

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=<font>"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=<font>"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=<font>"logImpl" value="SLF4J" />
    </settings>
</configuration>

2.測井對映器
透過如上所述配置日誌記錄,記錄對映器變得簡單。我們可以將記錄器名稱設定為對映器介面的完全限定名稱,或者如果使用 XML 對映器檔案則為名稱空間:

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

透過將記錄器與所需的對映器相關聯,可以輕鬆進行記錄控制。只有與此對映器相關的查詢才會應用跟蹤級別日誌記錄。

3.記錄特定對映器方法
要選擇性地記錄特定方法的執行,例如 FruitMapper 中的 getFruitById,我們可以相應地配置記錄器:

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

透過此配置,記錄器僅在執行getFruitById方法時將日誌列印到控制檯 ,從而允許更集中和更精細的日誌記錄控制。

4.在包中記錄對映器
透過將記錄器名稱設定為包名稱,我們可以輕鬆地為特定包下的所有對映器啟用日誌記錄:

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

這種方法允許在指定包內的所有對映器上進行全面的日誌記錄。

5.僅記錄 SQL 語句
在查詢可能產生大量結果集的場景中,我們可能更願意檢視 SQL 語句而不記錄實際結果。 MyBatis 被設計為在 DEBUG 級別記錄 SQL 語句,而在 TRACE 級別記錄結果。如果我們希望看到沒有結果的語句,我們需要將日誌記錄級別設定為 DEBUG:

<logger name=<font>"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 日誌記錄。

相關文章