2010-01-12 10 views
24

Ich habe einen vorhandenen Code, der eine java.sql.ResultSet akzeptiert, die Informationen enthält, die aus einer Oracle-Datenbank abgerufen werden. Ich möchte diesen Code jetzt wiederverwenden, aber ich würde gerne ein ResultSet Objekt übergeben, das ich selbst aus einigen In-Memory-Daten erstelle, die keiner Datenbank zugeordnet sind. Gibt es eine vorhandene Java-Framework-Klasse, die ich dafür verwenden kann? ResultSet hat Tonnen von Methoden, so implementiert meine eigene Klasse für das schien wie Overkill, obwohl ich die meisten Methoden für meinen speziellen Fall ignorieren konnte.Programmgesteuertes Erstellen eines Java ResultSet aus benutzerdefinierten Daten ohne Datenbank

Ich dachte über etwas nach dem alten Microsoft ADO-Recordset-Objekt nach, wo ich die Felder erstellen und dann die Zeilendaten für jedes Feld ausfüllen konnte. Das schien eine leicht zu übersetzende Frage zu sein, aber ich konnte keine guten Hinweise finden.

+1

Was ist 'java.sql.ResultData'? – skaffman

+0

Heh. Danke. Auch nach dem Korrekturlesen habe ich es dumm statt "ResultSet" 'ResultData' genannt ... zurück zum Bearbeiten! –

+0

Dies könnte auch helfen: http://stackoverflow.com/questions/878848/easy-way-to-fill-up-resultset-with-data –

Antwort

15
  • Erstellen Sie Ihre eigene AbstractResultSet Klasse arbeiten , die (wie AbstractQueue) alle Methoden implementiert, indem sie UnsupportedOperationException wirft (Eclipse generiert diese Methoden automatisch in Sekundenbruchteilen).
  • Jetzt erweitern AbstractResultSet. Die Unterklasse kann nur die Methoden überschreiben, die Sie implementieren möchten.
+0

Danke. Ich bin diesen Weg gegangen. Die AbstractResultSet-Klasse ist eine nette Ebene, die für das Rauschen aller throw-Anweisungen verwendet wird, und die letzte Implementierungsklasse kann nur sinnvollen Code enthalten. –

+0

Ich habe mit diesem https://gist.github.com/vilaca/3800337ccabea28a75d9165aaddefc9f einen Kern erstellt –

0

Normalerweise beantworte ich keine Java-Fragen, da ich kein Java-Entwickler bin, aber dies scheint ein architektonischer Fehler zu sein, wenn Sie ein SQL-Objekt aus Code erstellen müssen, um eine Methode zu recyceln . Ich würde denken, dass Sie möchten, dass Ihre Empfangsmethode eine andere spezifischere Form der Eingabe akzeptiert (z. B. ein benutzerdefiniertes Objekt-Array), um sie wiederverwendbar zu machen, und analysieren Sie dann Ihre ResultData in diesem Format.

+0

Hoppla ... Ich meinte 'ResultSet ', und es ist eher eine Schnittstelle als eine konkrete Klasse, also dachte ich, das wäre okay. Das ResultSet kann in seinem Inhalt ziemlich variabel sein, so dass eine Liste nicht die beste Wahl zu sein scheint. –

1

Meine erste Option wäre, den Code Refactoring, so dass es Liste < Map < String nimmt, Object > > oder etwas angemessen (das heißt, Liste < Map < String, Object > >, wenn die Daten um bewegt zu werden hat keine reale Struktur oder vollständig typisierte Objekte, wenn sie Struktur haben).

Wenn das nicht machbar oder zeiteffizient ist, ist der "Spaß" Hack, eine In-Memory H2-Datenbank abzufragen, um ein ResultSet zu erhalten. Wenn Sie keinen sinnvollen Stub für ResultSet finden, können Sie ihn leicht instanziieren, er könnte schneller sein als der eigene. (Ziehen Sie den jar in, schreiben Sie 20 Zeilen Code zum Erstellen der db und füllen Sie eine Tabelle).

+0

Einverstanden, das war es, was ich versuchte, in Java auszudrücken. +1 –

2

java.sql.ResultSet ist eine Schnittstelle, so dass Sie Ihre eigene Klasse erstellen können, die diese Schnittstelle implementiert.

+1

Er sagte ausdrücklich, dass die Implementierung von ResultSet eine Menge Arbeit (es ist wirklich) ist. – alex

+1

+1, obwohl es eine # & *! Last von Methoden hat. –

+0

Es wäre, wenn Sie versuchen würden, die gesamte Funktionalität der datenbankspezifischen ResultSet-Klassen zu erreichen, aber wenn Sie nur versuchen, ein ResultSet für bestimmte Fälle nachzuahmen, sollte es überhaupt nicht schwierig sein. Es ist wie er sagte. Er könnte die meisten Methoden ignorieren. – rayd09

7

Dies ist eine leicht links-Feld-Lösung, aber Sie könnten ein Mock Framework (z. B. JMock) verwenden. Diese Frameworks sind im Allgemeinen zum Erstellen von Scheinimplementierungen von Schnittstellen für Komponententests gedacht, aber ich sehe keinen Grund, warum Sie einen verwenden könnten, um eine "teilweise Implementierung" von java.sql.ResultSet zu erstellen.

Zum Beispiel, sagen Sie nur die getString() Methode, und nichts anderes implementieren wollten:

Mockery mockery = new Mockery(); 
final ResultSet resultSet = mockery.mock(ResultSet.class); 

mockery.checking(new Expectations() {{ 
    allowing(resultSet).getString(1); will(returnValue("my first string")); 
    allowing(resultSet).getString(2); will(returnValue("my second string")); 
}}); 

// resultSet is now a java.sql.ResultSet object, which you can pass to your legacy code 
resultSet.getString(1); 

eher unorthodox und recht umständlich, aber es sollte

Verwandte Themen