Estoy aprendiendo acerca de 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).Ver el SQL subyacente en Spring JdbcTemplate?
Respuesta
la Spring documentation dice que están conectados al nivel de depuración:
Todos SQL emitido por esta clase se registra en el nivel dede depuración en 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, es necesario configurar el registrador algo como:
<category name="org.springframework.jdbc.core.JdbcTemplate">
<priority value="debug" />
</category>
este tema fue sin embargo discuten aquí hace un mes y no parece tan fácil para llegar al trabajo como en Hibernate y/o no devolvió la información esperada: Spring JDBC is not logging SQL with log4j Este tema debajo de cada sugiere utilizar P6Spy que también se puede integrar en Spring según this article.
Use como nombre "org.springframework.jdbc", para ver también las consultas SQL reales. – Verhagen
No estoy 100% seguro de lo que está obteniendo, ya que generalmente pasará sus consultas SQL (parametrizadas o no) a JdbcTemplate, en cuyo caso solo las registraría. Si tiene PreparedStatement
sy no sabe cuál se está ejecutando, el método toString
debería funcionar bien. Pero mientras estamos en el tema, hay un buen paquete de registrador Jdbc here que le permitirá registrar automáticamente sus consultas, así como ver los parámetros vinculados cada vez. Muy útil. La salida se ve algo como esto:
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}
Que el 'PreparedStatement # toString()' devolvería la cadena de SQL no se especifica en ninguna parte en la API de JDBC y, por lo tanto, es un detalle de implementación. Depende de la marca y/o versión del controlador JDBC, ya sea que funcione o no. – BalusC
El enlace al que se hace referencia en su comentario a http://rkbloom.net/logdriver/ parece estar muerto ahora. ¿Puede proporcionar más detalles sobre este registrador? No puedo encontrar ninguna referencia en el sitio principal. Gracias – Bob
Esto funciona para mí con org.springframework.jdbc-3.0.6.RELEASE.jar. No pude encontrar esto en ningún lugar de 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 presentar propiedades para configurar el log4j:
log4j.logger.org.springframework.jdbc.core = TRACE
Esto muestra tanto la instrucción SQL y parámetros vinculados de esta manera:
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 sobre el tipo de SQL desconocido, pero supongo que podemos ignorarlo aquí
Durante un SQL (es decir, si usted no está interesado en los valores de los parámetros ligados) DEBUG
debería ser suficiente.
Los valores de los parámetros parecen imprimirse en el nivel TRACE.Esto funcionó para mí:
salidalog4j.logger.org.springframework.jdbc.core.JdbcTem plate=DEBUG, file
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=TRACE, file
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 funciona con jdbcTemplate y logback – Emilio
Esto funcionó para mí con log4j2 y xml parámetros:
<?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>
consola de resultados y del archivo de registro era:
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
Just copy/past
HTH
- 1. JPA vs Spring JdbcTemplate
- 2. JdbcTemplate y transacciones de Spring
- 3. Spring JdbcTemplate: ¿cómo limitar las filas seleccionadas?
- 4. ¿Cómo se usa programáticamente JdbcTemplate de Spring?
- 5. Spring JDBCTemplate Table Locking with MySQL
- 6. ¿Cómo pasar múltiples parámetros nombrados a Spring JdbcTemplate?
- 7. identidad desde la inserción de sql a través de jdbctemplate
- 8. ¿Cómo generar una lista dinámica "in (...)" sql a través de Spring JdbcTemplate?
- 9. Programación Java - Spring y JDBCTemplate - ¿Utiliza query, queryForList o queryForRowSet?
- 10. Spring JdbcTemplate/NamedParameterJdbcTemplate pasando el valor nulo como un valor de parámetro
- 11. Spring (MVC) ¿Evita la inyección de SQL?
- 12. JdbcTemplate y SimpleJdbcTemplate
- 13. Insertar varias filas usando JdbcTemplate
- 14. Android: delegado de eventos táctil para ver subyacente
- 15. Linq a SQL - Longitud de columna subyacente
- 16. ¿Varias instancias de JdbcTemplate o no?
- 17. consultas paginado con JdbcTemplate
- 18. ¿Spring JDBC brinda protección contra ataques de inyección SQL?
- 19. ¿Cómo puedo ver el SQL ActiveRecord genera?
- 20. Extraer datos utilizando spring jdbctemplate para cargar en una base de datos diferente
- 21. actualizar una fila usando la primavera JdbcTemplate
- 22. ¿Cómo ver el SQL ejecutado por LINQ en Visual Studio?
- 23. Ver SQL preparado con sp_prepare
- 24. Cómo ejecutar una instrucción INSERT utilizando la clase JdbcTemplate desde Spring Framework
- 25. ¿Debo poner esta función en Ver (código subyacente) o en ViewModel?
- 26. ¿Cómo puedo cancelar una consulta de larga ejecución utilizando Spring y JDBCTemplate?
- 27. Spring JdbcTemplate no puede obtener la Id. De inserción de MySQL
- 28. DropDownList obtener el objeto subyacente
- 29. ¿Cuál es el tema subyacente en OSGi?
- 30. Spring programmatic transaction management caveat?
Para aclarar, me gustaría ver el SQL con el '?' dentro para asegurarse de que todo el proceso funcionó correctamente. – Artem
Hola Artem, ¿Lo lograste en tu código? –