Voir le SQL sous-jacent dans le JdbcTemplate de printemps?
j'apprends les merveilles de Jdbctemplate et du Parameterjdbctemplate. J'aime ce que je vois, Mais y a-t-il un moyen facile de voir le SQL sous-jacent qu'il finit par exécuter? J'aimerais voir cela pour des fins de débogage (par exemple pour déboguer le SQL résultant dans un outil extérieur).
6 réponses
la documentation du ressort dit qu'ils sont enregistrés au niveau du débogage:
tout SQL émis par cette classe est enregistré au niveau DEBUG dans la catégorie correspondant au nom de classe pleinement qualifié de l'instance de modèle (typiquement JdbcTemplate, mais il peut être différent si vous utilisez une sous-classe personnalisée de la classe JdbcTemplate).
en termes XML, vous devez configurer l'enregistreur quelque chose comme:
<category name="org.springframework.jdbc.core.JdbcTemplate">
<priority value="debug" />
</category>
ce sujet a toutefois été abordé ici il y a un mois et il ne semble pas aussi facile de se rendre au travail qu'en hibernation et / ou il n'a pas retourné l'information attendue: printemps JDBC n'est pas logging SQL avec log4j ce sujet sous chaque suggère d'utiliser P6Spy qui peut également être intégré au printemps selon cet article .
Cela fonctionne pour moi avec org.springframework.jdbc-3.0.6.PUBLIER.pot. Je n'ai pas pu trouver ceci n'importe où dans les Docs de printemps (peut-être que je suis juste paresseux) mais j'ai trouvé (essai et erreur) que le niveau de TRACE a fait la magie.
j'utilise log4j-1.2.15 avec slf4j (1.6.4) et le fichier de propriétés pour configurer log4j:
log4j.logger.org.springframework.jdbc.core = TRACE
cela affiche à la fois la déclaration SQL et les paramètres liés comme ceci:
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
Not bien sûr sur le type SQL inconnu, mais je suppose que nous pouvons l'ignorer ici
pour juste un SQL (i.e. si vous n'êtes pas intéressé par les valeurs des paramètres liés) DEBUG
devrait suffire.
semblent être imprimées à L'état de TRACE. Cela a fonctionné pour moi:
log4j.logger.org.springframework.jdbc.core.JdbcTem plate=DEBUG, file
log4j.logger.org.springframework.jdbc.core.StatementCreatorUtils=TRACE, file
sortie de la Console:
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
cela a fonctionné pour moi avec log4j2 et les paramètres 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>
résultat console et Journal de fichiers était:
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
il suffit de copier/coller
HTH
Je ne suis pas sûr à 100% de ce que vous voulez en venir puisque d'habitude vous passerez dans vos requêtes SQL (paramétrées ou non) au JdbcTemplate, auquel cas vous n'aurez qu'à les enregistrer. Si vous avez PreparedStatement
s et que vous ne savez pas lequel est exécuté, la méthode toString
devrait fonctionner très bien. Mais pendant que nous sommes sur le sujet, il y a un joli paquet de logger Jdbc ici qui vous permettra d'enregistrer automatiquement vos requêtes ainsi que voir les paramètres liés chaque temps. Très utile. La sortie ressemble à quelque chose comme ceci:
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}
essayez d'ajouter 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>
vos logs ressemblent à:
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