如何在使用Spring的JDBCTemplate时返回PreparedStatement查询字符串?

时间:2016-02-22 19:47:20

标签: java spring spring-jdbc jdbctemplate

我使用的是Spring JdbcTemplate(Spring 4.1.4版)。我的班级' JdbcTemplate实例,我将select查询作为预准备语句。但是,我的查询意外地没有返回任何结果。因此,我真的需要调试我的查询,并确保查询是我期望它应该是。

如何在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);
  }
}

1 个答案:

答案 0 :(得分: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>

添加到您的lib 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不会调试,但它只会打印错误