返回

Java开发的福音!三招教会你SpringBoot+MyBatis快速输出SQL日志,快速解决问题

后端

SpringBoot 中输出 MyBatis SQL 日志的详解指南

在 SpringBoot 和 MyBatis 开发中,输出 SQL 日志至关重要,可帮助排查问题,如执行时间过长或语句不正确。本文将深入探讨输出 MyBatis SQL 日志的三种方法,提升开发效率和代码可靠性。

1. 使用 log4j2 输出 SQL 日志

log4j2 是 Java 中常用的日志框架,通过配置即可输出 MyBatis SQL 日志。

配置 log4j2

在项目目录下创建 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>
        <File name="MyBatis" fileName="mybatis.log">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="MyBatis"/>
        </Root>
        <Logger name="org.mybatis" level="DEBUG"/>
    </Loggers>
</Configuration>

代码示例

在控制台中查看 SQL 日志:

import org.apache.ibatis.logging.LogFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MybatisLogExample {

    private static final Logger logger = LoggerFactory.getLogger(MybatisLogExample.class);

    public static void main(String[] args) {
        // 执行 SQL 查询
        logger.info("Executing SQL query");
    }
}

2. 使用 MyBatis 自带的日志输出功能

MyBatis 自身提供日志输出功能,通过配置即可启用。

配置 MyBatis

在项目目录下创建 mybatis-config.xml 文件,并添加以下配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <logging implementation="org.apache.ibatis.logging.stdout.StdOutImpl"/>
    </settings>
</configuration>

代码示例

在控制台中查看 SQL 日志:

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisLogExample {

    public static void main(String[] args) {
        // 获取 SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(new InputStreamReader(new FileInputStream("mybatis-config.xml")));

        // 打开 SqlSession
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            // 执行 SQL 查询
            sqlSession.selectList("select * from table_name");
        }
    }
}

3. 使用第三方日志输出工具

除了 log4j2 和 MyBatis 自带的功能,还可使用第三方工具输出 SQL 日志。

p6spy

p6spy 是一个用于监视和记录 JDBC 连接的工具,可输出详细的 SQL 日志。

配置 p6spy

pom.xml 文件中添加依赖:

<dependency>
    <groupId>com.p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.12.0</version>
</dependency>

src/main/resources 目录下创建 p6spy.properties 文件,并添加以下配置:

appenderFactoryClass=com.p6spy.engine.spy.appender.JULToSlf4jAppenderFactory
applicationLoggerClass=com.p6spy.engine.common.Slf4jLogger
outputToConsole=true

jOOQ

jOOQ 是一个用于处理 SQL 查询和存储过程的库,提供强大的日志输出功能。

配置 jOOQ

pom.xml 文件中添加依赖:

<dependency>
    <groupId>org.jooq</groupId>
    <artifactId>jooq</artifactId>
    <version>3.17.6</version>
</dependency>

在项目代码中,使用 setLog() 方法配置 jOOQ 日志输出:

import org.jooq.DSLContext;
import org.jooq.impl.DSL;

public class MybatisLogExample {

    public static void main(String[] args) {
        // 获取 DSLContext
        DSLContext dslContext = DSL.using("jdbc:mysql://localhost:3306/database_name", "username", "password");

        // 设置日志输出
        dslContext.settings().setLog(true);

        // 执行 SQL 查询
        dslContext.select().from("table_name").fetch();
    }
}

HikariCP

HikariCP 是一个流行的连接池,提供日志输出功能,可用于记录 SQL 查询。

配置 HikariCP

pom.xml 文件中添加依赖:

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>4.0.3</version>
</dependency>

在项目代码中,使用 setLogWriter() 方法配置 HikariCP 日志输出:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class MybatisLogExample {

    public static void main(String[] args) {
        // 配置 HikariCP 数据源
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/database_name");
        config.setUsername("username");
        config.setPassword("password");

        // 设置日志输出
        config.setLogWriter(new PrintWriter(System.out));

        // 创建 HikariDataSource
        HikariDataSource dataSource = new HikariDataSource(config);
    }
}

结论

通过上述三种方法,开发人员可以在 SpringBoot 中轻松输出 MyBatis SQL 日志。根据不同的需求,选择合适的工具至关重要。通过记录 SQL 查询,可以快速排查问题,提高开发效率,并确保代码的健壮性。

常见问题解答

  1. 为什么需要输出 SQL 日志?
    输出 SQL 日志可用于分析查询性能、排查错误,并确保语句的正确性。

  2. log4j2 和第三方工具有何区别?
    log4j2 是一个通用日志框架,而第三方工具专用于记录 JDBC 连接。第三方工具通常提供更详细和专门化的日志输出选项。

  3. 哪种方法是最好的?
    最佳方法取决于具体需求。log4j2 是一个灵活且流行的选择,而第三方工具在日志自定义方面提供了更多选项。

  4. 如何将 SQL 日志记录到文件?
    在 log4j2 配置中使用 File appender 将日志记录到指定的文件中。

  5. 如何配置 p6spy 输出详细的日志信息?
    p6spy.properties 文件中设置 log.level=DEBUG 以启用详细日志记录。