Я узнаю о чудесах JdbcTemplate и NamedParameterJdbcTemplate. Мне нравится то, что я вижу, но есть ли простой способ увидеть базовый SQL, который он выполняет? Я хотел бы увидеть это для целей отладки (для того, чтобы, например, отладить полученный SQL в внешнем инструменте).
Видящий базовый SQL в Spring JdbcTemplate?
Ответ 1
Spring документация говорит, что они зарегистрированы на уровне DEBUG:
Все SQL, выпущенные этим классом, регистрируются на уровне DEBUG в категории , соответствующей полному классу имени класса экземпляра шаблона (обычно JdbcTemplate, но может быть и другим, если вы используете собственный подкласс класса JdbcTemplate).
В XML-терминах вам нужно настроить регистратор примерно так:
<category name="org.springframework.jdbc.core.JdbcTemplate">
<priority value="debug" />
</category>
Этот вопрос, однако, обсуждался здесь месяц назад, и, похоже, не так легко работать, как в Hibernate, и/или он не возвращает ожидаемую информацию: Spring JDBC не регистрирует SQL с log4j В этом разделе под каждым предлагается использовать P6Spy, который также может быть интегрирован в Spring в этой статье.
Ответ 2
Это работает для меня с 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
должно быть достаточно.
Ответ 3
Значения параметров отображаются на уровне 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
Ответ 4
Я не уверен на 100%, что вы получаете, так как обычно вы передаете свои SQL-запросы (параметризованные или нет) на JdbcTemplate, и в этом случае вы просто зарегистрируете их. Если у вас есть PreparedStatement
, и вы не знаете, какой из них выполняется, метод toString
должен работать нормально. Но пока мы находимся в этом вопросе, здесь есть замечательный пакет logger 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}
Ответ 5
Это работало для меня с параметрами 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
Просто скопируйте/прошлое
НТН