我正在学习 JdbcTemplate 和 NamedParameterJdbcTemplate 的奇妙之处。我喜欢我所看到的,但是有什么简单的方法可以查看它最终执行的底层 SQL 吗?我希望看到这个用于调试目的(例如为了在外部工具中调试生成的 SQL)。
8 回答
Spring 文档说它们是在 DEBUG 级别记录的:
该类发出的所有 SQL 都记录在与模板实例的完全限定类名对应的类别下的DEBUG级别(通常为 JdbcTemplate,但如果您使用的是 JdbcTemplate 类的自定义子类,则可能会有所不同)。
在 XML 术语中,您需要配置记录器,例如:
<category name="org.springframework.jdbc.core.JdbcTemplate">
<priority value="debug" />
</category>
然而,这个主题是一个月前在这里讨论过的,它似乎不像在 Hibernate 中那么容易开始工作和/或它没有返回预期的信息:Spring JDBC is not logging SQL with log4j this topic under eachSuggested to use 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
就足够了。
我将此行用于 Spring Boot 应用程序:
logging.level.org.springframework.jdbc.core = TRACE
这种方法非常普遍,我通常将它用于我的应用程序中的任何其他类。
参数值似乎打印在 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
我不是 100% 确定你得到了什么,因为通常你会将你的 SQL 查询(参数化或非参数化)传递给 JdbcTemplate,在这种情况下你只需记录这些。如果您有PreparedStatement
s 并且您不知道正在执行哪一个,则该toString
方法应该可以正常工作。但是,当我们讨论这个主题时,这里有一个不错的 Jdbc 记录器包,它可以让您自动记录您的查询以及每次查看绑定的参数。很有用。输出看起来像这样:
executing PreparedStatement: 'insert into ECAL_USER_APPT
(appt_id, user_id, accepted, scheduler, id) values (?, ?, ?, ?, null)'
with bind parameters: {1=25, 2=49, 3=1, 4=1}
无需任何 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