Voir le SQL sous-jacent dans Spring JdbcTemplate?

J’apprends les merveilles de JdbcTemplate et de NamedParameterJdbcTemplate. J’aime ce que je vois, mais existe-t-il un moyen facile de voir le SQL sous-jacent qu’il exécute? Je voudrais voir cela à des fins de débogage (afin par exemple de déboguer le SQL résultant dans un outil externe).

La documentation de Spring indique qu’ils sont enregistrés au niveau DEBUG:

Tout le SQL émis par cette classe est consigné au niveau DEBUG sous la catégorie correspondant au nom de classe complet de l’instance de modèle (généralement 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 comme suit:

   

Ce sujet a cependant été discuté ici il y a un mois et il ne semble pas aussi facile de travailler que dans Hibernate et / ou il n’a pas renvoyé les informations attendues: Spring JDBC n’enregistre pas SQL avec log4j Cette rubrique suggère d’utiliser P6Spy qui peut également être intégré au spring selon cet article .

Cela fonctionne pour moi avec org.springframework.jdbc-3.0.6.RELEASE.jar. Je ne pouvais pas trouver cela partout dans les documents de spring (peut-être que je suis juste paresseux) mais j’ai trouvé (essai et erreur) que le niveau TRACE faisait 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 l’instruction SQL et les parameters 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.Ssortingng], 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 

Je ne suis pas sûr du type SQL inconnu, mais je suppose que nous pouvons l’ignorer ici

Pour seulement un SQL (c’est-à-dire si vous n’êtes pas intéressé par les valeurs de parameters liés), DEBUG devrait suffire.

Les valeurs des parameters semblent être imprimées au niveau 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 les parameters log4j2 et xml:

    /some_path/logs/ my_app     [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n                      

La console de résultats et le journal de fichiers étaient les suivants:

 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.Ssortingng], SQL type unknown 

Juste copier / passé

HTH

Je ne suis pas sûr à 100% de ce que vous voulez savoir, car vous passerez généralement vos requêtes SQL (paramétrées ou non) à JdbcTemplate, auquel cas vous devrez simplement les enregistrer. Si vous avez PreparedStatement s et que vous ne savez pas lequel est en cours d’exécution, la méthode toSsortingng devrait fonctionner correctement. Mais pendant que nous sums sur le sujet, il y a un joli paquet de journal Jdbc ici qui vous permettra de connecter automatiquement vos requêtes ainsi que de voir les parameters liés à chaque fois. Très utile. La sortie ressemble à 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’append dans log4j.xml

         

vos journaux 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.Ssortingng], SQL type unknown