在Spring JdbcTemplate中查看底层SQL?

时间:2009-12-19 06:49:34

标签: sql jdbc spring-jdbc

我正在学习JdbcTemplate和NamedParameterJdbcTemplate的奇迹。我喜欢我所看到的,但有没有简单的方法来查看它最终执行的底层SQL?我希望看到这个用于调试目的(例如,为了在外部工具中调试生成的SQL)。

7 个答案:

答案 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