Lors de l'utilisation de PreparedStatement, vous souhaiterez peut-être connaître la chaîne de requête qui est réellement émise après la liaison de la valeur à l'espace réservé (par exemple, sortie dans le journal). Lorsque vous utilisez un framework, vous pouvez obtenir l'historique des requêtes émises à partir du framework, mais je ne vois pas beaucoup comment l'obtenir lorsque vous utilisez JDBC brut, alors je l'ai écrit. Les détails varient en fonction du pilote JDBC, donc MySQL et PostgreSQL sont décrits ci-dessous.
Nom du produit | version | |
---|---|---|
1 | Java | 8 |
2 | MySQL JDBC Driver | 5.1.44 |
3 | PostgreSQL JDBC Driver | 42.1.4 |
Il s'agit d'un exemple permettant d'obtenir et d'afficher la chaîne de caractères de la requête après avoir remplacé l'espace réservé. Obtient et affiche la chaîne de caractères de requête lors de l'accès à la colonne [nom] de la base de données [exemple] et de la table [COMPTE] dans l'environnement local.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*Exemple pour obtenir la chaîne de requête après le remplacement de l'espace réservé à partir de PreparedStatement
*/
public class JdbcTest {
public static void main(String... args) {
useMySQL();
System.out.println("=====================");
usePostgres();
}
/**
*Version MySQL
*/
private static void useMySQL() {
try (Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1/sample", "Nom d'utilisateur", "mot de passe");
PreparedStatement statement = connection.prepareStatement( "select * from ACCOUNT where (name like ?)");) {
statement.setString(1, "%hoge%");
//Obtenez et affichez la chaîne de requête ici
System.out.println("mysql > " + statement.toString());
if (statement instanceof com.mysql.jdbc.PreparedStatement) {
//Cast vers la version MySQL de PreparedStatement pour profiter des fonctionnalités spécifiques à MySQL
com.mysql.jdbc.PreparedStatement mysqlStatement = (com.mysql.jdbc.PreparedStatement) statement;
System.out.println("Pas de version de référence> " + mysqlStatement.asSql());
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
*Version de PostgreSQL
*/
private static void usePostgres() {
try (Connection connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/sample", "Nom d'utilisateur", "mot de passe");
PreparedStatement statement = connection.prepareStatement("select * from ACCOUNT where name = ?");) {
statement.setString(1, "hogehoge");
//Obtenez et affichez la chaîne de requête ici
System.out.println("postgres > " + statement.toString());
if (statement instanceof org.postgresql.jdbc.PgStatement) {
//Il n'y a pas de méthode asSql dans la version PostgreSQL de PreparedStatement
org.postgresql.jdbc.PgStatement postgresStatement = (org.postgresql.jdbc.PgStatement) statement;
System.out.println("Ceci est inchangé> " + postgresStatement.toString());
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
mysql > com.mysql.jdbc.JDBC42PreparedStatement@5ef04b5: select * from ACCOUNT where (name like '%hoge%')
Pas de version de référence> select * from ACCOUNT where (name like '%hoge%')
=====================
postgres > select * from ACCOUNT where name = 'hogehoge'
Ceci est inchangé> select * from ACCOUNT where name = 'hogehoge'
Comme vous pouvez le voir dans l'exemple de code, vous pouvez essentiellement obtenir la chaîne de requête après le remplacement de l'espace réservé en exécutant __java.util.PreparedStatement # toString () __. Cependant, dans le cas de MySQL, les informations de référence sont également incluses dans la chaîne de caractères qui peut être obtenue, donc si vous ne voulez que la chaîne de caractères de requête, vous devez exécuter __com.mysql.jdbc.PreparedStatement # asSql () __.