In Listing A werden Daten aus der Student-Tabelle abgerufen und den Anforderungen entsprechend angepasst. Obwohl JDBC eingesetzt wird, muss kaum JDBC-Code geschrieben werden. (Eventuell muss die in dem Beispiel angegebene Benutzername-/Passwort-Kombination entsprechend der spezifischen Datenbank-Konfiguration angepasst werden.)
Dieser Code erfordert die folgenden Schritte:
- Die JDBC-Treiberklasse laden und mithilfe des DriverManager eine Datenbank-Verbindung erstellen.
- Die QueryRunner-Klasse instanziieren.
- Die query-Methode für die Verbindung, die SQL-Abfrage, die Parameter und den ResultSetHandler als Eingabe verwenden. Es wird ein org.apache.commons.dbutils.handlers.MapListHandler benutzt. Ein MapListHandler verarbeitet ein ResultSet und gibt eine java.util.List aus java.util.Map-Instanzen zurück. Daher wird jede Zeile im ResultSet eine java.util.Map, wobei all diese java.util.Map-Instanzen in einer java.util.List zusammengefasst werden.
- Die Liste durchgehen und dabei die Werte aus jeder Map in der Liste entnehmen.
- Mit dem QueryRunner eine Methode ausführen, die keine Parameter verwendet. Hierzu wird der BeanListHandler verwendet, der ein besonders praktischer ResultSetHandler ist, da man das ResultSet in eine Liste zu einem spezifischen Bean umwandeln kann. Hier gibt man die als StudentBean vorgesehene Bean-Klasse an, wie Listing B zeigt.
- Die Liste der gefundenen Beans durchgehen und Werte aus jeder Instanz von StudentBean entnehmen.
HINWEIS: In Listing B musste die StudId in der StudentBean-Klasse int lauten, da der Typ der StudId-Spalte in der Student-Tabelle int ist. Diese Typ-Anpassung ist die einzige Regel, die zu beachten ist.
Da in diesem Fall die Eigenschaften der StudentBean-Klasse und die Felder der Student-Tabelle perfekt angepasst wurden, genügte die Angabe der StudentBean-Klasse als Parameter. Der Feld-Wert wird mit demselben Namen wie die Feldnamen in die Eigenschaften eingefügt. Wenn man dagegen die Erstellung des Beans stärker kontrollieren will, bietet die BeanListHandler-Klasse hierfür einen zweiten Konstruktor: BeanListHandler(java.lang.Class type, RowProcessor convert). Implementierungen der RowProcessor-Schnittstelle konvertieren Zeilen im ResultSet in Objekte. Im Falle des StudentBean wurde die BasicRowProcessor-Implementierung von RowProcessor benutzt, die mit der Aufgabe gut zurechtkam. Man kann jedoch auch eine neue Implementierung schreiben und diese für den BeanListHandler-Konstruktor bereitstellen.
Die Ausgabe nach Ausführung des Codes hängt natürlich davon ab, welche Daten sich in der Student-Tabelle befinden. In diesem Fall entstand die folgende Ausgabe:
Neben den bereits vorgestellten Klassen sollte man sich auch die folgenden Klassen einmal ansehen:
- org.apache.commons.dbutils.QueryLoader: QueryLoader ist eine einfache Klasse, die Abfragen aus einer Datei in eine Map lädt. Die Abfragen werden dann bei Bedarf aus der Map entnommen. In einer Datei befindliche Abfragen ermöglichen außerdem eine einfache Durchführung von Änderungen, ohne dafür den Code bearbeiten zu müssen.
- org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet: Diese Klasse kann als systematische Vorgehensweise zur Handhabung von Null-Werten dienen. Man verpackt ein normales ResultSet mit einer Instanz des SqlNullCheckedResultSet und legt dann fest, was im Falle von Null-Werten geschehen soll.
- org.apache.commons.dbutils.wrappers.StringTrimmedResultSet: Man verpackt ein ResultSet mit dem StringTrimmedResultSet und kann dadurch alle von den Methoden getString() und getObject() zurückgegebenen Strings abgleichen.
Die DbUtils-Komponente ist praktisch, kompakt und bietet zahlreiche Optionen, die sie zu einem nützlichen Hilfsmittel für alle Projekte machen, in denen JDBC verwendet wird.
Neueste Kommentare
Noch keine Kommentare zu Implementierung von DbUtils
Kommentar hinzufügenVielen Dank für Ihren Kommentar.
Ihr Kommentar wurde gespeichert und wartet auf Moderation.