Frage

Ich dachte, ich wusste alles über UDTs und JDBC, bis jemand auf SO weist darauf hin, einige Details der Javadoc von java.sql.SQLInput und java.sql.SQLData JavaDoc zu mir. Das Wesen dieser Hinweis war (von SQLInput):

Ein Eingangsstrom, der enthält einen Stream von Werten, die eine Instanz eine SQL-strukturiert Typ oder eine SQL unterschiedliche Art. Diese Schnittstelle verwendet nur für individuelle Zuordnung wird verwendet, um durch der Fahrer hinter den Kulissen, und ein Programmierer nie direkt aufrufen SQLInput Methoden.

Das ist genau das Gegenteil von dem, was ich gewohnt bin (was auch und stabil in produktiven Systemen eingesetzt wird, wenn es mit den Oracle-JDBC-Treiber verwendet): Implementieren SQLData und bieten diese Implementierung in einer benutzerdefinierten Zuordnung

ResultSet.getObject(int index, Map mapping)

Der JDBC-Treiber wird dann Call-Back auf meinem benutzerdefinierten Typ mit dem

SQLData.readSQL(SQLInput stream, String typeName)

Methode. Ich diese Methode implementieren und jedes Feld aus dem SQLInput Strom gelesen. Am Ende getObject() eine korrekt initialisiert Instanz meiner SQLData Implementierung Rückkehr alle Daten aus dem UDT zu halten.

Für mich scheint dies der perfekte Weg, eine solche individuelle Zuordnung zu implementieren. Gute Gründe für das Gehen auf diese Weise:

  • ich den Standard-API verwenden kann, anstelle der Verwendung von herstellerspezifischen Klassen wie oracle.sql.STRUCT, etc.
  • Ich kann Quellcode von meinem UDTs erzeugen, mit entsprechenden Getter / Setter und anderen Eigenschaften

Meine Fragen :

  • Was denken Sie über meinen Ansatz, SQLData Umsetzung? Ist es rentabel, auch wenn die Javadoc nichts anderes ergibt?
  • Was andere Lesarten UDT in Java kennen Sie? Z.B. Was macht Spring? Was macht Hibernate? Was macht JPA? Was tun Sie?

Nachtrag :

UDT Unterstützung und Integration mit gespeicherten Prozeduren ist eine der wichtigsten Funktionen von jOOQ . jOOQ zielt auf die komplexeren „JDBC Fakten“ von Client-Code versteckt, ohne die zugrunde liegende Datenbank-Architektur versteckt. Wenn Sie ähnliche Fragen wie die oben haben, könnten jOOQ eine Antwort auf Sie.

War es hilfreich?

Lösung

Der Vorteil, den Fahrer so zu konfigurieren, dass es hinter den Kulissen funktioniert, ist, dass der Programmierer nicht den Typ der Karte in ResultSet.getObject passieren muss (...) und hat daher ein weniger Detail zu erinnern (die meiste Zeit ). Der Fahrer kann auch zur Laufzeit konfiguriert werden, Eigenschaften mit Hilfe der Mappings zu definieren, so dass der Anwendungscode unabhängig von den Details des SQL Typs Objektzuordnungen gehalten werden. Wenn die Anwendung mehrere verschiedene Datenbanken unterstützen könnte, diese unterschiedlichen Zuordnungen können für jede Datenbank unterstützt werden.

Ihr Verfahren durchführbar ist, ist seine Haupteigenschaft, dass der Anwendungscode explizit Typzuordnungen verwendet.

In der hinter den Kulissen Ansatz der ResultSet.getObject (int) -Methode die Typzuordnungen auf die Verbindung festgelegt nutzen werden, anstatt die von dem Anwendungscode in ResultSet.getObject (int index, Map-Mapping) übergibt. Ansonsten sind die Ansätze gleich.

Andere Ansätze

Ich habe einen anderen Ansatz mit JBoss 4 basierend auf diesen Klassen verwendet gesehen:

org.jboss.ejb.plugins.cmp.jdbc.JDBCParameterSetter 
org.jboss.ejb.plugins.cmp.jdbc.JDBCResultSetReader.AbstractResultSetReader

Die Idee ist die gleiche, aber die Umsetzung ist nicht-Standard (es wahrscheinlich vorgeDaten die Version des JDBC-Standard definiert, SQLData / SQLInput).

Andere Tipps

Was andere Möglichkeiten des Lesens UDT in Java kennen Sie? Z.B. Was macht Spring? Was macht Hibernate? Was macht JPA? Was tun Sie?

Ein Beispiel, wie so etwas wie dies in Hibernate / JPA geschehen ist in dieser Antwort auf eine andere Frage gezeigt:

Java Aufzählungen, JPA und Postgres Aufzählungen - Wie kann ich sie zusammenarbeiten, um

?

Ich weiß, was Frühling tut: Sie schreiben Implementierungen ihrer RowMapper Schnittstelle. Ich habe nie verwendet SQLData mit Frühling. Ihr Beitrag war das erste Mal, dass ich von oder dachte über diese Schnittstelle gehört habe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top