Je travaille avec Exemple: p> Paretstatement code> avec MySQL Server.
String myQuery = "select id from user where name = ?";
PreparedStatement stmt = sqlConnection.prepareStatement(myQuery);
stmt.setString(1, "test");
stmt.executeQUery();
ResultSet rs = stmt.getResultSet();
6 Réponses :
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 P>
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.
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: ceci est parce que MySQL prend en charge Déclarations préparées par le côté serveur . P> (plus probablement il Utilise le protocole binaire, mais ce code est juste de faire un point) p> p>
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!
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.
Bonjour, je implémente le code suivant qui va chercher SQL SQL de 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[" + "] ...");
}
}
Approche légèrement différente de toutes les réponses ici, P>
Si vous connaissez des options de débogage dans Eclipse. Vous pouvez essayer ce qui suit: p>
Définissez un point d'arrêt à Cliquez avec le bouton droit sur votre application, dites Effectuez une étape qui vous permet de mentionner mentionné dans la question. p> li>
Si vous vérifiez que vous vérifiez Tout ce que vous voyez comme valeur de De plus, si vous ne voulez pas continuer à regarder cette variable, vous pouvez toujours essayer stmt.executequery (); code> p> li>
Débogou sous Code> Sélectionnez l'application Java CODE> (ou tout ce qui est applicable dans votre cas, c'est-à-dire l'application Springboot, etc. P> < / li>
onglet variables code> dans
Perspective de débogage code> de Eclipse, vous trouverez des variables telles que
MyQuery code>,
stmt < / code> (selon votre code) p> li>
stmt code> serait la requête complète de SQL dont vous avez besoin. p> li>
ol>
Java Logging code> et imprimer votre requête complète SQL dans les journaux. P>