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.
Produktname | Ausführung | |
---|---|---|
1 | Java | 8 |
2 | MySQL JDBC Driver | 5.1.44 |
3 | PostgreSQL JDBC Driver | 42.1.4 |
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);
}
}
}
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'
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.