【问题标题】:How do I get back a PreparedStatement query string when using Spring's JDBCTemplate?使用 Spring 的 JDBCTemplate 时如何取回 PreparedStatement 查询字符串?
【发布时间】:2016-02-22 19:47:20
【问题描述】:

我正在使用 Spring 的 JdbcTemplate(Spring 版本 4.1.4)。使用我的班级'JdbcTemplate 实例,我将选择查询作为准备好的语句。但是,我的查询意外地没有返回任何结果。因此,我真的需要调试我的查询并确保查询符合我的预期。

如何取回作为JdbcTemplate 内部PreparedStatement 的一部分对数据库执行的实际SQL?

我熟悉使用 PreparedStatement's toString() method 来完成此操作,但由于 JDBCTemplate 在内部使用 PreparedStatement,我不确定使用 Spring 的可行性。

我正在使用的一些示例代码如下:

private static final String PREPARED_QUERY =
    "select\n" +
        "  spm.amount\n" +
        "from\n" +
        "  search_price_modifier spm\n" +
        "where\n" +
        "  spm.search_id = ?\n" +
        "  and spm.search_date > to_date(?, 'MM-DD-YYYY HH24:MI:SS')\n" +
        "  and spm.search_date < to_date(?, 'MM-DD-YYYY HH24:MI:SS')\n";

public void runQuery(String searchId, String strSearchDateInfimum,
    String strSearchDateSupremum) {

  SqlRowSet amounts = this.jdbcTemplate.queryForRowSet(
      PREPARED_QUERY_FOR_FLAT_MARKUP_VERIFICATION,
      searchId, strSearchDateInfimum, strSearchDateSupremum);
  while (amounts.next()) {
    float amount = amounts.getFloat("AMOUNT");
    LOGGER.debug("amount=" + amount);
  }
}

【问题讨论】:

  • 您是否在同一个请求上尝试过计数(*)?只是为了确保请求/参数有效并返回结果?
  • 您可能在 fromwhere 之前缺少空格,具体取决于 JDBCTemplate 如何解释 \n。你确定没有抛出异常吗?
  • 不确定您使用的是什么 GUI。在 Eclipse 中,您可以调试以获取 SQL 语句和正在发送的参数。您也可以在 from 和 where 子句之前添加空格。也尝试添加 Try catch 块
  • @VirtualTroll,感谢您的提示。不幸的是,count(1) 也返回 0 行。但它不应该。
  • @MickMnemonic,我认为它正确解释了空格,因为没有发生错误,只是没有返回数据。

标签: java spring spring-jdbc jdbctemplate


【解决方案1】:

我将给出一个通用的方法来调试你的所有语句并在你想要的时候在控制台中查看它们,因为 spring 默认会这样做 添加到你的类路径

该类发出的所有 SQL 都记录在与模板实例的全限定类名对应的类别下的 DEBUG 级别(通常为 JdbcTemplate,但如果您使用的是 JdbcTemplate 类的自定义子类,则可能会有所不同) .

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration >
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="error">
            <AppenderRef ref="Console" />
        </Root>
        <Logger level="debug" name="org.springframework.jdbc">
            <AppenderRef ref="Console" />
        </Logger>
    </Loggers>
</configuration>

log4j-api-2.5.jar log4j-core-2.5.jar log4j-jcl.2.5.jar 添加到您的库中,您现在就可以开始了。

关闭调试 改变等级

        <Logger level="error" name="org.springframework.jdbc">
            <AppenderRef ref="Console" />
        </Logger>

现在 spring 不会调试,但它只会打印错误

【讨论】:

    猜你喜欢
    • 2015-05-30
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多