[JAVA] So wird die Abfragezeichenfolge bei Verwendung von PreparedStatement in JDBC tatsächlich ausgegeben

Einführung

Wenn Sie PreparedStatement verwenden, möchten Sie möglicherweise die Abfragezeichenfolge kennen, die tatsächlich ausgegeben wird, nachdem der Wert an den Platzhalter gebunden wurde (z. B. Ausgabe an das Protokoll). Wenn Sie ein Framework verwenden, können Sie den ausgegebenen Abfrageverlauf aus dem Framework abrufen, aber ich sehe nicht viel darüber, wie Sie ihn bei Verwendung von einfachem JDBC abrufen können. Deshalb habe ich ihn geschrieben. Die Details unterscheiden sich je nach JDBC-Treiber. Daher werden MySQL und PostgreSQL im Folgenden beschrieben.

Umgebung

Produktname Ausführung
1 Java 8
2 MySQL JDBC Driver 5.1.44
3 PostgreSQL JDBC Driver 42.1.4

Beispielcode

Dies ist ein Beispiel, um die Abfragezeichenfolge nach dem Ersetzen des Platzhalters tatsächlich abzurufen und anzuzeigen. Ruft die Abfragezeichenfolge ab und zeigt sie an, wenn auf die Spalte [Name] der Datenbank [Beispiel] und die Tabelle [ACCOUNT] in der lokalen Umgebung zugegriffen wird.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *Beispiel zum Abrufen der Abfragezeichenfolge nach dem Ersetzen des Platzhalters aus PreparedStatement
 */
public class JdbcTest {

	public static void main(String... args) {
		useMySQL();
		System.out.println("=====================");
		usePostgres();
	}

	/**
	 *MySQL-Version
	 */
	private static void useMySQL() {
		try (Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1/sample", "Nutzername", "Passwort");
				PreparedStatement statement = connection.prepareStatement( "select * from ACCOUNT where (name like ?)");) {

			statement.setString(1, "%hoge%");
			//Hier können Sie die Abfragezeichenfolge abrufen und anzeigen
			System.out.println("mysql    > " + statement.toString());

			if (statement instanceof com.mysql.jdbc.PreparedStatement) {
				//Wechseln Sie zur MySQL-Version von PreparedStatement, um die MySQL-spezifischen Funktionen zu nutzen
				com.mysql.jdbc.PreparedStatement mysqlStatement = (com.mysql.jdbc.PreparedStatement) statement;
				System.out.println("Keine Referenzversion> " + mysqlStatement.asSql());
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}

	/**
	 *PostgreSQL-Version
	 */
	private static void usePostgres() {
		try (Connection connection = DriverManager.getConnection("jdbc:postgresql://127.0.0.1:5432/sample", "Nutzername", "Passwort");
				PreparedStatement statement = connection.prepareStatement("select * from ACCOUNT where name = ?");) {

			statement.setString(1, "hogehoge");
			//Hier können Sie die Abfragezeichenfolge abrufen und anzeigen
			System.out.println("postgres     > " + statement.toString());

			if (statement instanceof org.postgresql.jdbc.PgStatement) {
				//In der PostgreSQL-Version von PreparedStatement gibt es keine asSql-Methode
				org.postgresql.jdbc.PgStatement postgresStatement = (org.postgresql.jdbc.PgStatement) statement;
				System.out.println("Dies ist unverändert> " + postgresStatement.toString());
			}
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
}

Ausgabe

mysql    > com.mysql.jdbc.JDBC42PreparedStatement@5ef04b5: select * from ACCOUNT where (name like '%hoge%')
Keine Referenzversion> select * from ACCOUNT where (name like '%hoge%')
=====================
postgres     > select * from ACCOUNT where name = 'hogehoge'
Dies ist unverändert> select * from ACCOUNT where name = 'hogehoge'

Zusammenfassung

Wie Sie dem Beispielcode entnehmen können, können Sie die Abfragezeichenfolge nach dem Ersetzen des Platzhalters grundsätzlich abrufen, indem Sie __java.util.PreparedStatement # toString () __ ausführen. Im Fall von MySQL sind die Referenzinformationen jedoch auch in der Zeichenfolge enthalten, die abgerufen werden kann. Wenn Sie also nur die Abfragezeichenfolge möchten, müssen Sie __com.mysql.jdbc.PreparedStatement # asSql () __ ausführen.

Recommended Posts

So wird die Abfragezeichenfolge bei Verwendung von PreparedStatement in JDBC tatsächlich ausgegeben
Erste Schritte mit JDBC mit PostgresSQL unter MacOS
[Java] Wie man mit der String-Klasse an die Spitze eines bestimmten Strings kommt
[Java] So erhalten Sie mithilfe von Stream auf einfache Weise die längste Zeichenfolge von ArrayList
Gibt an, ob SSL bei Verwendung von JDBC mit MySQL aktiviert werden soll.
So erhalten Sie den Klassennamen des Arguments von LoggerFactory.getLogger, wenn Sie SLF4J in Java verwenden
[Rails] Lösung, wenn bei Verwendung von Capybara mit Rspec der Fehler "undefined method` visit '" angezeigt wird
Festlegen von Umgebungsvariablen bei Verwendung von Payjp mit Rails
So erhalten Sie das Protokoll, wenn install4j nicht gestartet wird
So schreiben Sie eine Abfrageoption bei Verwendung von gem ruby-firebase (Denkmal)
Wie fange ich mit schlank an?
So erhalten Sie den Inhalt von Map mithilfe des for-Anweisungsmemorandums
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
[Java] So konvertieren Sie vom Typ String in den Pfadtyp und erhalten den Pfad
[Rails 5] Anzeigen des Bildschirms zum Ändern des Kennworts bei Verwendung von devise
[Hinweis] Erste Schritte mit Rspec
[Java] So erhalten Sie das aktuelle Verzeichnis
So erhalten Sie das aktuelle Datum als Zeichenfolge im Format JJJJMMTT
[Rails] So erhalten Sie die aktuell mit devise angemeldeten Benutzerinformationen
So erhalten Sie das Datum mit Java
graphql-ruby: So erhalten Sie den Namen der Abfrage oder Mutation im Controller Hinweis
So erhalten Sie die ID eines Benutzers, der sich in Swift bei Firebase authentifiziert hat
So implementieren Sie die Brotkrumenfunktion mit gretel
Wie komme ich zum heutigen Tag?
So löschen Sie die Datenbank beim Neuerstellen der App
Erste Schritte mit Eclipse Micro Profile
So löschen Sie eine Ressourcendatei mit Spring-Boot
[Java] So erhalten Sie die endgültige umgeleitete URL
So löschen Sie den dem Benutzer zugeordneten Tweet, wenn Sie ihn gleichzeitig löschen
Anfordern durch Übergeben eines Arrays an eine Abfrage mit dem HTTP-Client von Ruby
[Swift] So zeigen Sie die eingegebenen Zeichen im Widget über UserDefaults an, wenn Sie das WidgetKit verwenden
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
[Java] So erhalten Sie die URL der Übergangsquelle
So ändern Sie die Aktion mit mehreren Senden-Schaltflächen
So führen Sie mit RxAndroid einen Komponententest mit JVM an einer Quelle durch
Hinzufügen von Zeichen zur Anzeige bei Verwendung der link_to-Methode
[Java] So erhalten Sie den Maximalwert von HashMap
Organisierte schrittweise Interaktion mit dem JDK
[Android] So erhalten Sie die Einstellungssprache des Terminals
Abfragen von Arrays in jsonb mit Rails + postgres
[Rails] So erhalten Sie den Inhalt starker Parameter
[Swift] So erhalten Sie die Firebase-Dokument-ID
Wie man mit cli jdk etc. von oracle bekommt
[Ruby] Gewöhnen Sie sich an, beim Erstellen einer Kopie einer Zeichenfolgenvariablen die dup-Methode zu verwenden
Überprüfen Sie, wie Sie das Zeitlimit festlegen, wenn Sie eine Verbindung zu Spring + HikariCP + MySQL herstellen und SQL ausführen
So reduzieren Sie die Programmlast ein wenig, wenn Sie Zeichen mit JAVA kombinieren
So generieren Sie automatisch ein ER-Diagramm bei der Migration mit Rails 6
So erhalten Sie den Namen einer Klasse / Methode, die in Java ausgeführt wird
So machen Sie einen Screenshot mit dem Android Studio-Emulator
Testen des Einschlusses von Bildern bei Verwendung von ActiveStorage und Faker
So stellen Sie die Chronik ein, wenn sich die Zeit in CentOS7 verschiebt
Importieren Sie die Datumszeichenfolge, die mit java.time.LocalDate automatisch in Excel konvertiert wird
So erhalten Sie Werte in Echtzeit mit TextWatcher (Android)