Java-Programmierung - Frühling und JDBCTemplate - Verwenden Sie Abfrage, queryForList oder queryForRowSet?

StackOverflow https://stackoverflow.com/questions/1660756

Frage

Mein Java (JDK6) Projekt verwendet Frühling und JDBCTemplate für alle Datenbankzugriff. Wir bekamen ein Upgrade vor kurzem von Spring 2.5 zum Frühling 3 (RC1). Das Projekt kein ORM wie Hibernate noch EJB .

Wenn ich eine Reihe von Aufzeichnungen lesen müssen, und einige interne Verarbeitung mit ihnen, wie es scheint, gibt es mehrere (überladene) Methoden: Abfrage, queryForList und queryForRowSet

Was sollten die Kriterien sein, einen zu verwenden, anstatt des anderen? Gibt es Performance-Unterschiede? Empfohlene Vorgehensweise?

Können Sie einige externe Referenzen für die weitere Forschung zu diesem Thema empfehlen?

War es hilfreich?

Lösung

Ich finde, dass der normale Weg, als Liste zuzugreifen über die query() Methoden eher als alle anderen Ansätze. Der wesentliche Unterschied zwischen query und den anderen Methoden ist, dass Sie eine des Callback-Interfaces implementieren müssen werden (entweder RowMapper, RowCallbackHandler oder ResultSetExtractor) die Ergebnismenge zu handhaben.

Ein RowMapper ist wahrscheinlich, was Sie selbst die meiste Zeit mit finden. Er wird verwendet, wenn jede Zeile der Ergebnismenge zu einem Objekt in der Liste entspricht. Sie haben nur eine einzige Methode mapRow zu implementieren, wo Sie die Art des Objekts zu füllen, die in Ihrer Reihe geht es zurück. Frühling hat auch eine BeanPropertyRowMapper, die die Objekte in einer Liste über die passenden Bean Eigenschaftsnamen die Spaltennamen (NB diese Klasse ist die Einfachheit halber nicht Leistung) bevölkern können.

Ein RowCallbackHandler ist nützlicher, wenn Sie Ihre Ergebnisse müssen mehr sein als nur eine einfache Liste. Sie werden die Rückkehr Objekt verwalten müssen sich Sie diesen Ansatz verwenden. Ich finde mich in der Regel diese verwenden, wenn ich eine Karte Struktur als meine Rückgabetyp müssen (das heißt für gruppierte Daten für einen Baum Tisch oder wenn ich einen benutzerdefinierten Cache-Erstellung auf Basis des Primärschlüssels).

Ein ResultSetExtractor verwendet, wenn Sie die Iteration der Ergebnisse steuern möchten. Sie implment eine einzige Methode extractData, dass der Rückgabewert des Anrufs wird auf query. Ich nur finde mich diese zu verwenden, wenn ich einige benutzerdefinierte Datenstruktur zu bauen, die komplexer ist entweder der anderen Callback-Schnittstellen zu bauen verwendet wird.

Die queryForList() Methoden wertvoll sind, dass Sie müssen nicht diese Callback-Methoden implementieren. Es gibt zwei Möglichkeiten queryForList verwenden. Die erste ist, wenn Sie nur eine einzige Spalte aus der Datenbank (zum Beispiel eine Liste von Strings) abfragt, um die Versionen des Verfahrens verwenden kann, die eine Klasse als Argument Ihnen automatisch gibt eine Liste nur Objekte dieser Klassen .

Wenn Sie die anderen Implementierungen von queryForList() Aufruf finden Sie eine Liste mit jedem Eintrag wieder eine Karte für jede Spalte zu sein. Während dies in so schön ist, werden Sie die Kosten für das Schreiben der Callback-Methoden gespeichert, mit dieser Datenstruktur zu tun ist recht unhandlich. Sie werden sich finden eine Menge Casting zu tun, da die Werte der Karte des Typs Object sind.

Ich habe eigentlich nie die queryForRowSet Methoden in der freien Natur verwendet gesehen. Dadurch wird das gesamte Ergebnis der Abfrage in ein CachedRowSet Objekt wapped durch eine Feder SqlRowSet laden. Ich sehe einen großen Nachteil in diesem Objekt, dass mit, wenn Sie die SqlRowSet um zu den anderen Schichten der Anwendung vorbei sind, werden Sie diese Schichten auf Ihre Daten zugreifen Implementierung Kopplung.

Sie sollten keine großen Leistungsunterschiede zwischen einem dieser Gespräche, außer sehen, wie ich mit dem BeanPropertyRowMapper erwähnt. Wenn Sie mit einiger komplexen Manipulation einer großen Ergebnismenge arbeiten, könnten Sie in der Lage sein, einige Performance-Gewinne erhalten aus einer optimierten ResultSetExtractor für Ihren speziellen Fall zu schreiben.

Wenn Sie mehr erfahren möchten würde ich die Frühling JDBC konsultieren Dokumentation und die JavaDoc für die Klassen ich habe genannte . Sie können auch einen Blick auf einige der Bücher auf dem Spring Framework nehmen. Obwohl es ein bisschen veraltet Java-Entwicklung mit dem Spring Framework auf einen sehr guten Abschnitt hat mit dem JDBC-Framework arbeiten. Vor allem würde ich sagen, nur versuchen, einen Code mit jeder Methode zu schreiben und sehen, was für Sie am besten funktioniert.

Andere Tipps

Da Sie in der wunderbaren Generics Land sind, was Sie wirklich tun möchten, ist SimpleJdbcTemplate und verwenden seine query() Methoden für Lists von Objekten und queryForObject() für einzelne Objekte. Begründung dafür ist einfach, dass sie noch einfacher zu bedienen als die in JdbcTemplate.

Eine kleine Ergänzung zu den hervorragenden Antworten oben: zusätzliche Methoden, wie queryForInt, queryForLong, queryForMap, queryForObject etc. könnte so gute Möglichkeiten manchmal scheint, wenn Sie eine einfache Abfrage ausführen und eine einzelne Zeile erwarten

Wenn Sie jedoch 0 oder 1 Reihen zurück bekommen können, sind die queryForList Verfahren im Allgemeinen einfacher, sonst würden Sie IncorrectResultSizeDataAccessException zu fangen. Ich habe gelernt, dass die harte Art und Weise.

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