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

有帮助吗?

解决方案

Spring文档 说他们记录在调试级别:

该类发出的所有 SQL 都记录在 调试 水平下 类别 对应完全合格的 班级名称 模板实例(通常是 JdbcTemplate,但如果您使用 JdbcTemplate 类的自定义子类,则可能会有所不同)。

用 XML 术语来说,您需要对记录器进行如下配置:

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

然而,这个主题是一个月前在这里讨论的,它似乎不像在 Hibernate 中那么容易开始工作和/或它没有返回预期的信息: Spring JDBC 不使用 log4j 记录 SQL 每个主题下的这个主题建议使用 P6间谍 也可以根据Spring集成 本文.

其他提示

这对我的作品与org.springframework.jdbc-3.0.6.RELEASE.jar。 我找不到在春节这个文档的任何地方(也许我只是懒惰的),但我发现(试验和错误)的跟踪级别做了魔法。

我正在与SLF4J(1.6.4)沿使用的log4j-1.2.15和属性文件来配置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.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

这个工作对我来说与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

我使用此行为Spring引导应用:

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

这个方法非常普遍的,我通常用它为我的应用程序内的任何其他类。

我不是100%肯定你在因为通常你会在你的SQL查询(参数或不)JdbcTemplate的,在这种情况下,您只需登录那些通过得到什么。如果你有PreparedStatements,你不知道正在执行其中之一,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} 

尝试增加在的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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top