Hibernate(59)Hibernate的SQL日志如何查看?

在开发和调试Hibernate应用程序时,查看生成的SQL日志是非常有用的。Hibernate提供了多种方式来查看SQL日志,包括通过配置文件和编程方式来启用SQL日志记录。下面将详细解释如何配置和查看Hibernate的SQL日志,并结合代码示例说明。

1. 通过配置文件启用SQL日志

配置Hibernate

hibernate.cfg.xml中启用SQL日志输出和格式化:

xml 复制代码
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 数据库连接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
        <property name="hibernate.connection.username">your_username</property>
        <property name="hibernate.connection.password">your_password</property>

        <!-- Hibernate 属性配置 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.use_sql_comments">true</property>

        <!-- 映射类 -->
        <mapping class="com.example.domain.Product"/>
    </session-factory>
</hibernate-configuration>
  • hibernate.show_sql:将生成的SQL输出到控制台(标准输出)。
  • hibernate.format_sql:格式化SQL输出,使其更具可读性。
  • hibernate.use_sql_comments:在生成的SQL中添加注释,帮助开发者理解每个SQL片段的来源。
Maven依赖(如果使用Maven)

确保在pom.xml中包含slf4jlogback依赖,以便日志记录:

xml 复制代码
<dependencies>
    <!-- Hibernate dependencies -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.4.0.Final</version>
    </dependency>

    <!-- SLF4J and Logback for logging -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.30</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>
配置Logback

创建logback.xml文件,配置日志记录级别:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="org.hibernate.SQL" level="DEBUG" additivity="false">
        <appender-ref ref="STDOUT" />
    </logger>

    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE">
        <appender-ref ref="STDOUT" />
    </logger>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
  • org.hibernate.SQL:记录Hibernate生成的SQL语句。
  • org.hibernate.type.descriptor.sql.BasicBinder:记录SQL参数绑定信息。

2. 编程方式启用SQL日志

除了通过配置文件外,还可以通过编程方式启用SQL日志。

配置Hibernate

hibernate.cfg.xml中配置基本的Hibernate属性:

xml 复制代码
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 数据库连接配置 -->
        <property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/your_database</property>
        <property name="hibernate.connection.username">your_username</property>
        <property name="hibernate.connection.password">your_password</property>

        <!-- Hibernate 属性配置 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 映射类 -->
        <mapping class="com.example.domain.Product"/>
    </session-factory>
</hibernate-configuration>
编程方式启用SQL日志
java 复制代码
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HibernateSQLLoggingExample {
    private static final Logger logger = LoggerFactory.getLogger(HibernateSQLLoggingExample.class);
    private static final SessionFactory sessionFactory;

    static {
        Configuration configuration = new Configuration().configure("hibernate.cfg.xml");
        configuration.setProperty("hibernate.show_sql", "true");
        configuration.setProperty("hibernate.format_sql", "true");
        configuration.setProperty("hibernate.use_sql_comments", "true");
        sessionFactory = configuration.buildSessionFactory();
    }

    public static void main(String[] args) {
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        try {
            Product product = new Product();
            product.setName("Product B");
            product.setPrice(200.0);
            session.save(product);
            transaction.commit();
        } catch (Exception e) {
            if (transaction != null) {
                transaction.rollback();
            }
            e.printStackTrace();
        } finally {
            session.close();
        }
    }
}

3. 查看SQL日志

运行程序后,可以在控制台看到格式化的SQL日志和参数绑定信息。例如:

复制代码
10:23:45.678 [main] DEBUG org.hibernate.SQL - 
    insert 
    into
        product
        (name, price, id) 
    values
        (?, ?, ?)
10:23:45.680 [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [1] as [VARCHAR] - Product B
10:23:45.681 [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [2] as [DOUBLE] - 200.0
10:23:45.682 [main] TRACE org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [3] as [BIGINT] - 1

总结

  1. 通过配置文件启用SQL日志 :在hibernate.cfg.xml中配置hibernate.show_sqlhibernate.format_sqlhibernate.use_sql_comments等属性。
  2. 配置日志框架 :使用SLF4J和Logback记录SQL日志,并在logback.xml中配置日志级别。
  3. 编程方式启用SQL日志:通过编程方式动态设置Hibernate属性。
  4. 查看SQL日志:运行程序后,在控制台查看格式化的SQL日志和参数绑定信息。

通过这些方法,可以方便地查看和调试Hibernate生成的SQL语句,帮助开发者更好地理解和优化数据库操作。希望这些详细的解释和代码示例能帮助您更好地查看和管理Hibernate的SQL日志。

相关推荐
oak隔壁找我5 小时前
JVM常用调优参数
java·后端
蝎子莱莱爱打怪9 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
NineData9 小时前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
狼爷11 小时前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
小兔崽子去哪了13 小时前
Java 自动化部署
java·后端
ma_king13 小时前
入门 java 和 数据库
java·数据库·后端
后端AI实验室13 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞18 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing18 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven9720 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java