我正在学习JdbcTemplate和NamedParameterJdbcTemplate的奇迹。我喜欢我所看到的,但有没有简单的方法来查看它最终执行的底层SQL?我希望看到这个用于调试目的(例如,为了在外部工具中调试生成的SQL)。
答案 0 :(得分:46)
Spring documentation表示他们已在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每个下面的主题都建议使用{ {3}}也可以根据P6Spy在Spring中集成。
答案 1 :(得分:32)
这适用于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
就足够了。
答案 2 :(得分:6)
参数值似乎打印在TRACE级别。这对我有用:
log4j.logger.org.springframework.jdbc.core.JdbcTem plate=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
答案 3 :(得分:2)
这对我有用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
只需复制/过去
HTH
答案 4 :(得分:1)
我将以下行用于Spring Boot应用程序:
logging.level.org.springframework.jdbc.core = TRACE
这种方法相当通用,我通常将其用于应用程序内的任何其他类。
答案 5 :(得分:0)
我不是100%确定你得到的是什么,因为通常你会将你的SQL查询(参数化或不参数化)传递给JdbcTemplate,在这种情况下你只需要记录它们。如果你有PreparedStatement
并且你不知道正在执行哪一个,那么toString
方法应该可以正常工作。但是,当我们讨论这个主题时,有一个很好的Jdbc记录器包here,它可以让你自动记录查询,并且每次都能看到绑定的参数。很有用。输出看起来像这样:
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}
答案 6 :(得分:0)
尝试添加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