在 SpringJdbcTemplate 中查看底层 SQL?

我正在学习 JdbcTemplate 和 NamedParameter terJdbcTemplate 的奇妙之处。我喜欢我所看到的,但是有什么简单的方法可以看到它最终执行的底层 SQL 吗?我希望在调试目的上看到这一点(例如,为了在外部工具中调试结果 SQL)。

135168 次浏览

Spring 文档显示它们是在 DEBUG 级别记录的:

这个类发出的所有 SQL 都在 调试级别上记录,类别对应于模板实例的完全限定的 类名(通常是 JdbcTemplate,但是如果您使用的是 JdbcTemplate 类的自定义子类,那么它可能会有所不同)。

用 XML 术语来说,您需要配置日志记录器,比如:

<category name="org.springframework.jdbc.core.JdbcTemplate">
<priority value="debug" />
</category>

然而这个主题在一个月前已经在这里讨论过了,它似乎不像在 Hibernate 中那样容易工作,并且/或者它没有返回预期的信息: SpringJDBC 没有使用 log4j 记录 SQL这个主题建议使用 P6Spy,根据 这篇文章,它也可以在 Spring 中集成。

这对我来说在 org.springframework.jdbc-3.0.6.RELEASE.jar 中是可行的。 我在 Spring 文档的任何地方都找不到这个(也许我只是懒) ,但是我发现(尝试和错误) TRACE 级别起到了神奇的作用。

我使用 log4j-1.2.15以及 slf4j (1.6.4)和属性文件来配置 log4j:

log4j.logger.org.springframework.jdbc.core = TRACE

这将同时显示 SQL 语句和绑定参数,如下所示:

Executing prepared SQL statement [select HEADLINE_TEXT, NEWS_DATE_TIME from MY_TABLE where PRODUCT_KEY = ? and NEWS_DATE_TIME between ? and ? order by NEWS_DATE_TIME]
Setting SQL statement parameter value: column index 1, parameter value [aaa], value class [java.lang.String], SQL type unknown
Setting SQL statement parameter value: column index 2, parameter value [Thu Oct 11 08:00:00 CEST 2012], value class [java.util.Date], SQL type unknown
Setting SQL statement parameter value: column index 3, parameter value [Thu Oct 11 08:00:10 CEST 2012], value class [java.util.Date], SQL type unknown

不确定 SQL 类型未知,但我想我们可以忽略它在这里

对于仅仅一个 SQL (例如,如果您对绑定参数值不感兴趣) ,DEBUG应该足够了。

参数值似乎是在 TRACE 级别上打印出来的。这对我很有效:

log4j.logger.org.springframework.jdbc.core.JdbcTemplate=DEBUG, file
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=TRACE, file

控制台输出:

02:40:56,519 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 1, parameter value [Tue May 31 14:00:00 CEST 2005], value class [java.util.Date], SQL type unknown
02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 2, parameter value [61], value class [java.lang.Integer], SQL type unknown
02:40:56,528 TRACE http-bio-8080-exec-13 core.StatementCreatorUtils:206 - Setting SQL statement parameter value: column index 3, parameter value [80], value class [java.lang.Integer], SQL type unknown

对于 log4j2和 xml 参数,这对我很有用:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="debug">
<Properties>
<Property name="log-path">/some_path/logs/</Property>
<Property name="app-id">my_app</Property>
</Properties>


<Appenders>
<RollingFile name="file-log" fileName="${log-path}/${app-id}.log"
filePattern="${log-path}/${app-id}-%d{yyyy-MM-dd}.log">
<PatternLayout>
<pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
</pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
</Policies>
</RollingFile>


<Console name="console" target="SYSTEM_OUT">
<PatternLayout
pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
</Console>
</Appenders>
<Loggers>


<Logger name="org.springframework.jdbc.core" level="trace" additivity="false">
<appender-ref ref="file-log" />
<appender-ref ref="console" />
</Logger>


<Root level="info" additivity="false">
<appender-ref ref="file-log" />
<appender-ref ref="console" />
</Root>
</Loggers>


</Configuration>

结果控制台和文件日志为:

JdbcTemplate - Executing prepared SQL query
JdbcTemplate - Executing prepared SQL statement [select a, b from c where id = ? ]
StatementCreatorUtils - Setting SQL statement parameter value: column index 1, parameter value [my_id], value class [java.lang.String], SQL type unknown

只是复制/过去

高温

尝试添加 log4j.xml

<!--  enable query logging -->
<category name="org.springframework.jdbc.core.JdbcTemplate">
<priority value="DEBUG" />
</category>


<!-- enable query logging for SQL statement parameter value -->
<category name="org.springframework.jdbc.core.StatementCreatorUtils">
<priority value="TRACE" />
</category>

你的日志看起来像:

DEBUG JdbcTemplate:682 - Executing prepared SQL query
DEBUG JdbcTemplate:616 - Executing prepared SQL statement [your sql query]
TRACE StatementCreatorUtils:228 - Setting SQL statement parameter value: column index 1, parameter value [param], value class [java.lang.String], SQL type unknown

对于 Spring Boot 应用程序,我使用这一行:

logging.level.org.springframework.jdbc.core = TRACE

这种方法非常通用,我通常将其用于应用程序中的任何其他类。

不需要任何 xml 或 yml 配置就可以做到这一点,只需要纯 Java 代码即可,如下所示:

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;


Logger logger = (Logger) LoggerFactory.getLogger("org.springframework.jdbc.core.JdbcTemplate");
logger.setLevel(Level.valueOf("DEBUG"));


// Or ,for more datasource details,you can retrieve another logger  like this
// Logger logger2 = (Logger) LoggerFactory.getLogger("org.springframework.jdbc");
//logger2.setLevel(Level.valueOf("DEBUG"));

好好享受吧,伙计们, 请点击这里查看更多 https://www.bswen.com/2019/05/springboot-how-to-print-jpa-and-jdbctemplate-sql-logs.html