sql - journaldev - spring mvc jdbc example
¿Al ver el SQL subyacente en Spring JdbcTemplate? (6)
Estoy aprendiendo sobre las maravillas de JdbcTemplate y NamedParameterJdbcTemplate. Me gusta lo que veo, pero ¿hay alguna manera fácil de ver el SQL subyacente que termina ejecutando? Me gustaría ver esto con fines de depuración (para, por ejemplo, depurar el SQL resultante en una herramienta externa).
Esto funcionó para mí con los parámetros log4j2 y 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>
Result console y el archivo de registro fue:
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
Solo copia / pasado
HTH
Esto funciona para mí con org.springframework.jdbc-3.0.6.RELEASE.jar. No pude encontrar esto en ningún lado en los documentos de Spring (tal vez soy perezoso) pero encontré (prueba y error) que el nivel TRACE hizo la magia.
Estoy usando log4j-1.2.15 junto con slf4j (1.6.4) y el archivo de propiedades para configurar log4j:
log4j.logger.org.springframework.jdbc.core = TRACE
Esto muestra tanto la declaración de SQL como los parámetros vinculados como este:
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
No estoy seguro de que el tipo de SQL sea desconocido, pero creo que podemos ignorarlo aquí
Solo para un SQL (es decir, si no está interesado en valores de parámetros enlazados) DEBUG
debería ser suficiente.
Intente agregar en 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>
tus registros se ven así:
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
La documentación de Spring dice que están registrados a nivel de DEPURACIÓN:
Todos los SQL emitidos por esta clase se registran en el nivel de DEPURACIÓN bajo la categoría correspondiente al nombre de clase totalmente calificado de la instancia de plantilla (generalmente JdbcTemplate, pero puede ser diferente si está utilizando una subclase personalizada de la clase JdbcTemplate).
En términos XML, debe configurar el registrador de la siguiente manera:
<category name="org.springframework.jdbc.core.JdbcTemplate">
<priority value="debug" />
</category>
Sin embargo, este tema se discutió aquí hace un mes y no parece tan fácil comenzar a trabajar como en Hibernate y / o no devolvió la información esperada: Spring JDBC no está registrando SQL con log4j Este tema debajo de cada uno sugiere usar P6Spy que también se puede integrar en Spring según este artículo .
Los valores de los parámetros parecen estar impresos en el nivel TRACE. Esto funcionó para mí:
log4j.logger.org.springframework.jdbc.core.JdbcTem plate=DEBUG, file
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=TRACE, file
Salida de la consola:
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
No estoy 100% seguro de a lo que te refieres, ya que generalmente pasarás tus consultas SQL (parametrizadas o no) a JdbcTemplate, en cuyo caso solo las registrarías. Si tiene PreparedStatement
y no sabe cuál se está ejecutando, el método toString
debería funcionar bien. Pero mientras hablamos sobre el tema, aquí hay un buen paquete de registrador Jdbc que le permitirá automáticamente registrar sus consultas y ver los parámetros vinculados cada vez. Muy útil. El resultado se ve así:
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}