Java 日志记录中 SQL 日志怎么开启
在 java 项目中开启 sql 日志,核心做法是将持久层框架(如 mybatis、hibernate/jpa)的 sql 执行语句映射到具体的日志实现上。通常只需调整对应 mapper 接口或 entitymanager 所在包路径的日志级别为 debug 或 trace,并配置好日志输出格式即可。这样当程序执行数据库操作时,控制台或日志文件会打印出完整的 sql 语句及参数绑定情况。

MyBatis 环境下如何配置 SQL 日志
在 MyBatis 项目中,SQL 日志通过配置 Mapper 接口的包路径来实现。将日志级别设为 DEBUG 可打印 SQL 语句和参数,设为 TRACE 还能看到结果集。需要确保日志实现(如 Logback 或 Log4j2)已正确加载,否则修改级别无效。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 关键配置:指定 MyBatis Mapper 接口所在的包 -->
<logger name="com.example.mapper" level="DEBUG" />
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>上述配置中,com.example.mapper 需替换为你项目中实际存放 Mapper 接口的包名。当该包下的方法被调用时,日志系统会捕获并输出对应的 SQL 信息。若使用 XML 方式定义 Mapper,则 logger 的 name 应指向对应的 XML 命名空间 ID。
立即学习“Java免费学习笔记(深入)”;
Hibernate/JPA 环境下如何配置 SQL 日志
对于 Hibernate 或 JPA 项目,SQL 日志由 Hibernate 内部组件控制。主要涉及两个属性:show_sql 用于控制是否在控制台打印 SQL,format_sql 用于美化输出格式。此外,还需配合日志框架将 org.hibernate.SQL 级别调高,以获取更详细的参数绑定信息。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- 开启 Hibernate SQL 打印及格式化 -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<!-- 关键配置:调整 Hibernate 内部日志级别 -->
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>在 persistence.xml 或 application.properties 中设置 show_sql=true 后,Hibernate 会在执行 DML 语句时直接输出 SQL。配合 BasicBinder 的 TRACE 级别,可以查看具体参数值,便于排查参数绑定错误。注意,生产环境中建议关闭此功能以避免性能损耗和敏感数据泄露。
SQL 日志中占位符与参数的对应关系是什么
在开启 SQL 日志后,通常会看到类似 select * from user where id = ? 的输出。这里的 ? 是占位符,实际参数值会在后续日志行中以 binding parameter [1] 的形式单独列出。这种分离设计是为了防止 SQL 注入并提高预处理效率。开发者在排查问题时,需要将占位符位置与参数绑定行的索引一一对应,才能还原完整的执行语句。


















