Wie man Parameter von PreparedStatement?
Ich Schreibe generischen logger für die SQLException und ich möchte die get-Parameter übergeben wurden, in PreparedStatement, wie es zu tun ? Ich war in der Lage, um die Anzahl von Ihnen.
ParameterMetaData metaData = query.getParameterMetaData();
parameterCount = metaData.getParameterCount();
InformationsquelleAutor der Frage IAdapter | 2011-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Antwort: das können Sie nicht.
Lange Antwort: Alle JDBC-Treiber halten die Werte der parameter irgendwo, aber es gibt keine standard-Weg, um Sie zu bekommen.
Wenn Sie möchten, drucken Sie zur Fehlersuche oder ähnliche Zwecke verfolgen, haben Sie mehrere Möglichkeiten:
Erstellen einer pass-through-JDBC-Treiber (Verwendung p6spy oder log4jdbc als basis) hält Kopien der Parameter und bietet eine öffentliche API, Sie zu Lesen.
Verwendung von Java Reflection-API (
Field.setAccessible(true)
ist dein Freund) zu Lesen, die privaten Daten, die Strukturen der JDBC-Treiber. Das ist mein bevorzugter Ansatz. Ich habe eine Fabrik, die Delegierten zu den DB-spezifischen Implementierungen kann das Dekodieren der Parameter und das ermöglicht es mir zum Lesen der Parameter übergetObject(int column)
.Einen bug-report erstellen und darum bitten, dass das Ausnahmen sind, verbessert werden. Vor allem Oracle ist wirklich geizig, wenn es darum geht, Ihnen zu sagen, was falsch ist.
InformationsquelleAutor der Antwort Aaron Digulla
Lösung 1: Unterklasse
Einfach erstellen Sie eine benutzerdefinierte Implementierung eines PreparedStatementdie delegiert alle Aufrufe an die original-vorbereitete Anweisung, nur mehr Rückrufe in die setObjectetc. Methoden. Beispiel:
Wenn Sie möchten, speichern Sie Parameter und erhalten Sie später, es gibt viele Lösungen, aber ich bevorzuge, erstellen eine neue Klasse, wie ParameterAwarePreparedStatement die Parameter in einer map. Die Struktur könnte ähnlich sein:
- Lösung 2: Dynamisch proxy
Diese zweite Lösung ist kürzer, scheint aber mehr hacky.
Können Sie erstellen, die eine dynamische proxy-durch den Aufruf der factory-Methode auf java.lang.reflektieren.Proxy und delegiert alle Aufrufe auf die ursprüngliche Instanz. Beispiel:
Dann abfangen die setObjectetc. Anrufe durch einen Blick auf die Methode Namen und auf der Suche nach der zweiten Methode Argumente für Ihre Werte.
InformationsquelleAutor der Antwort voho
Dieser ArtikelBoulder, ahtoulgh DB-2 "spezifische", gibt ein vollständiges Beispiel ParameterMetadata Nutzung.
InformationsquelleAutor der Antwort Riduidel