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日志。

相关推荐
野生技术架构师2 小时前
【面试题】为什么 Java 8 移除了永久代(PermGen)并引入了元空间(Metaspace)?
java·开发语言
Leo July2 小时前
【Java】Java设计模式实战指南:从原理到框架应用
java·开发语言·设计模式
Anastasiozzzz2 小时前
力扣hot100 20.有效的括号 解析
java·算法·面试·力扣
brave_zhao2 小时前
如何解决 Spoon 与 Carte 互联的 UTF-8 编码问题
java
重生之我是Java开发战士2 小时前
【数据结构】Map、Set与哈希表底层原理
java·数据结构·散列表
L.EscaRC2 小时前
深度解析 Spring 框架核心代理组件 MethodProxy.java
java·开发语言·spring
拽着尾巴的鱼儿2 小时前
Spring 缓存 @Cacheable 实现原理
java·spring·缓存
dabidai2 小时前
JSR-250JavaEE规范
java
Jackson@ML2 小时前
2026最新版IntelliJ IDEA安装使用指南
java·ide·intellij-idea