[JAVA] Comment faire en sorte que la chaîne de requête émette réellement lors de l'utilisation de PreparedStatement dans JDBC

introduction

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.

environnement

Nom du produit version
1 Java 8
2 MySQL JDBC Driver 5.1.44
3 PostgreSQL JDBC Driver 42.1.4

Exemple de code

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);
		}
	}
}

production

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'

Résumé

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 () __.

Recommended Posts

Comment faire en sorte que la chaîne de requête émette réellement lors de l'utilisation de PreparedStatement dans JDBC
Comment démarrer avec JDBC en utilisant PostgresSQL sur MacOS
[Java] Comment accéder au début d'une chaîne spécifique à l'aide de la classe String
[Java] Comment obtenir facilement la plus longue chaîne de caractères d'ArrayList à l'aide de stream
Activer ou non SSL lors de l'utilisation de JDBC avec MySQL.
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
[Rails] Solution lorsque l'erreur "visite de la méthode non définie" "apparaît lors de l'utilisation de Capybara avec Rspec
Comment définir des variables d'environnement lors de l'utilisation de Payjp avec Rails
Comment obtenir le journal lorsque install4j ne démarre pas
Comment écrire une option de requête lors de l'utilisation de gem ruby-firebase (memorial)
Comment démarrer avec Slim
Comment obtenir le contenu de la carte à l'aide du mémorandum d'instructions
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
[Java] Comment convertir du type String en type Path et obtenir le chemin
[Rails 5] Comment afficher l'écran de changement de mot de passe lors de l'utilisation de l'appareil
[Note] Comment démarrer avec Rspec
[Java] Comment obtenir le répertoire actuel
Comment obtenir la date actuelle sous forme de chaîne au format aaaaMMjj
[Rails] Comment obtenir les informations sur l'utilisateur actuellement connecté avec devise
Comment obtenir la date avec Java
graphql-ruby: Comment obtenir le nom de la requête ou de la mutation dans le contrôleur Remarque
Comment obtenir l'ID d'un utilisateur qui s'est authentifié avec Firebase dans Swift
Comment mettre en œuvre la fonction de chapelure avec Gretel
Comment obtenir le jour d'aujourd'hui
Comment effacer la base de données lors de la recréation de l'application
Comment démarrer avec Eclipse Micro Profile
Comment sortir un fichier de ressources avec spring-boot
[Java] Comment obtenir l'URL redirigée finale
Comment supprimer le tweet associé à l'utilisateur lorsque vous le supprimez en même temps
Comment demander en passant un tableau à une requête avec le client HTTP de Ruby
[Swift] Comment afficher les caractères saisis sur le Widget via UserDefaults lors de l'utilisation du WidgetKit
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
[Java] Comment obtenir l'URL de la source de transition
Comment changer l'action avec plusieurs boutons d'envoi
Comment faire un test unitaire avec JVM sur une source à l'aide de RxAndroid
Comment ajouter des caractères à afficher lors de l'utilisation de la méthode link_to
[Java] Comment obtenir la valeur maximale de HashMap
Organisé comment interagir avec le JDK par étapes
[Android] Comment obtenir la langue de réglage du terminal
Comment interroger Array dans jsonb avec Rails + postgres
[Rails] Comment obtenir le contenu des paramètres forts
[Swift] Comment obtenir l'ID de document Firebase
Comment obtenir JDK etc. depuis Oracle avec CLI
[Ruby] Prenez l'habitude d'utiliser la méthode dup lors de la copie d'une variable chaîne
Vérifiez comment définir le délai d'expiration lors de la connexion avec Spring + HikariCP + MySQL et de l'exécution de SQL
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
Comment générer automatiquement un diagramme ER lors de la migration avec Rails 6
Comment obtenir le nom d'une classe / méthode exécutée en Java
Comment faire une capture d'écran avec l'émulateur Android Studio
Comment tester avec des images lors de l'utilisation d'ActiveStorage et de Faker
Comment régler chrony lorsque le temps change dans CentOS7
Importez la chaîne de date automatiquement convertie en Excel avec java.time.LocalDate
Comment obtenir des valeurs en temps réel avec TextWatcher (Android)