11
votes

Puis-je obtenir la requête complète qu'une estabilité est sur le point d'exécuter?

Je travaille avec Paretstatement code> avec MySQL Server.

Exemple: p>

String myQuery = "select id from user where name = ?";
PreparedStatement stmt  = sqlConnection.prepareStatement(myQuery);
stmt.setString(1, "test");
stmt.executeQUery();
ResultSet rs = stmt.getResultSet();


0 commentaires

6 Réponses :


3
votes

Vous ne pouvez pas, car Java n'est pas responsable de la construire. Les déclarations préparées sont prises en charge au sein de MySQL. Java envoie donc le SQL paramétralisé réel ("Sélectionnez l'ID d'utilisateur à partir de l'utilisateur où nom =?") Directement sur MySQL avec les paramètres


2 commentaires

En fait, certains pilotes JDBC font le travail du côté du client et envoient une requête entièrement paramétrée au serveur (je ne sais pas quelle manière le pilote MySQL utilise). Il n'y a pas de moyen standardisé d'obtenir la déclaration de SQL "complète" de toute façon.


@ Joachim Sauer: MySQL Connector / J 3.1 et plus récente des déclarations préparées par le serveur utilisateur.



3
votes

Je peux vous dire ce que c'est. Si vous utilisez MySQL 4.1 ou plus récent avec connecteur / J 3.1 ou plus récent, ce sera quelque chose comme: xxx

ceci est parce que MySQL prend en charge Déclarations préparées par le côté serveur .

(plus probablement il Utilise le protocole binaire, mais ce code est juste de faire un point)


0 commentaires

4
votes

Vous ne pouvez pas vraiment sortir de la requête qui sera exécutée, mais il y a des API de journalisation qui vous connecteront à la base de données de la base de données, telle que log4JDBC et P6SPY .


0 commentaires

12
votes

Il n'est pas mandaté par la spécification JDBC, mais plusieurs pilotes JDBC ont laissé le tostring code> d'un préparé (code> de renvoi de la requête qui sera exécutée, et le connecteur de MySQL / J'arrive à avoir ce comportement (ou au moins cela a-t-il fait il y a quelques années).

String myQuery = "select id from user where name = ?";
PreparedStatement stmt  = sqlConnection.prepareStatement(myQuery);
stmt.setString(1, "test");
System.out.println(stmt); // May do what you want!


3 commentaires

Merci! stmt.tostring () a résolu le problème.


Si STMT.TOSTRING () ne fonctionne pas, essayez de suivre la solution fournie dans cet article: javaworld.com/javaworld/jw-01-2002/...


Cela fonctionne sur le pilote Postgres (9.1) aussi.



3
votes

Bonjour, je implémente le code suivant qui va chercher SQL SQL de préparé de la constitution forte>. Pas besoin d'utiliser un pot et un pilote.

public void printSqlStatement(PreparedStatement preparedStatement, String sql) throws SQLException{
        String[] sqlArrya= new String[preparedStatement.getParameterMetaData().getParameterCount()];
        try {
               Pattern pattern = Pattern.compile("\\?");
               Matcher matcher = pattern.matcher(sql);
               StringBuffer sb = new StringBuffer();
               int indx = 1;  // Parameter begin with index 1
               while (matcher.find()) {
             matcher.appendReplacement(sb,String.valueOf(sqlArrya[indx]));
               }
               matcher.appendTail(sb);
              System.err.println("Executing Query [" + sb.toString() + "] with Database[" + "] ...");
               } catch (Exception ex) {
                   System.err.println("Executing Query [" + sql + "] with Database[" +  "] ...");
            }

    }


0 commentaires

1
votes

Approche légèrement différente de toutes les réponses ici,

Si vous connaissez des options de débogage dans Eclipse. Vous pouvez essayer ce qui suit:

  1. Définissez un point d'arrêt à stmt.executequery ();

  2. Cliquez avec le bouton droit sur votre application, dites Débogou sous Sélectionnez l'application Java (ou tout ce qui est applicable dans votre cas, c'est-à-dire l'application Springboot, etc. < / li>

  3. Effectuez une étape qui vous permet de mentionner mentionné dans la question.

  4. Si vous vérifiez que vous vérifiez onglet variables dans Perspective de débogage de Eclipse, vous trouverez des variables telles que MyQuery , stmt < / code> (selon votre code)

  5. Tout ce que vous voyez comme valeur de stmt serait la requête complète de SQL dont vous avez besoin.

    De plus, si vous ne voulez pas continuer à regarder cette variable, vous pouvez toujours essayer Java Logging et imprimer votre requête complète SQL dans les journaux.


0 commentaires