org.springframework.jdbc
.
Hier gibt es vier Pakete welche die Arbeit mit JDBC vereinfachen sollen.
core
core
-Paket bietet Unterstützung bei dem Zugriff auf Datenbanken mit JDBC. Es bietet die Klasse
JdbcTemplate
an. Mit dieser Klasse sind Datenbankabfragen einfacher zu programmieren. Der Programmierer muss
sich nicht mehr um das Herstellen der Verbindung, die Ausführung des Statements, die Exception-Behandlung oder das Schließen
der Verbindung kümmern. Es ist nur noch nötig das Statement festzulegen und die Ergebnisse zu behandeln. Eine
XML-Konfigurationdatei zum Ausführen von Statements und Queries könnte wie folgt aussehen:
<!-- XML-Header --> <beans> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <property name="url" value="jdbc.hsqldb:hsql://localhost:"/> <property name="username" value="system"/> <property name="password" value="manager"/> </bean> <bean id="execStatement" class="ExecStatement"> <property name="dataSource" ref="dataSource"/> </bean> <bean id="runQuery" class="RunQuery"> <property name="dataSource" ref="dataSource"/> </bean> </beans>Dies konfiguriert eine Bean
dataSource
, die alle Informationen zum Verbinden mit einer Datenbank enthält. Spring
stellt verschiedene DataSource
s zur Verfügung. Die hier genutzte DriverManagerDataSource
ermöglicht
es Verbindung zu Datenbanken mit dem angegebenen Treiber herzustellen. Spring bietet verschiedene vorgefertige,
konfigurierbare DataSource
s und abstrakte Klassen, um eigene DataSource
s zu erstellen, an. Die Bean
execStatement
bekommt, um den Zugriff auf die Datenbank zu ermöglichen, eine Referenz auf diese DataSource
zugewiesen. Dies gilt auch für die Bean runQuery
. Die Klasse ExecStatement
, welche die komplette
Behandlung des Statements beinhaltet, sieht folgendermaßen aus:
import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; public class ExecStatement { private JdbcTemplate jt; private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public void doExecute() { jt = new JdbcTemplate(dataSource); jt.execute("create table mytable (id integer, name varchar(100))"); } }Bei Erzeugung der Bean durch Spring wird die Eigenschaft
dataSource
durch die entsprechende Setter-Methode
gestezt. Zum Ausführen des Statements wird lediglich die Methode doExecute
aufgerufen.runQuery
zum Ausführen von Queries sieht wie folgt aus:
import javax.sql.DataSource; import org.springframework.jdbc.core.JdbcTemplate; public class RunQuery { private JdbcTemplate jt; private DataSource dataSource; public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } public int getCount() { jt = new JdbcTemplate(dataSource); int count = jt.queryForInt("select count(*) from mytable"); return count; } public List getList() { jt = new JdbcTemplate(dataSource); List rows = jt.queryForList("select * from mytable"); return rows; } }Die Erzeugung geschieht wie auch bei dem Ausführen des Statements. Das
JdbcTemplate
von Spring bietet
verschiedene Methoden um auf Datenbanken zuzugreifen. Weitere Methoden sind zum Beispiel queryForLong
,
update
oder queryForObject
.
datasource
DataSourceUtils |
bietet statische Klassen zum Aufbauen und Schließen von Verbindungen. |
---|---|
SmartDataSource |
Interface gegen das komplett eigene DataSource s geschrieben werden können. |
AbstractDataSource |
Abstrakte Klasse, die zum einfachen Erstellen von eigenen DataSource s erweitert werden kann. |
SingleConnectionDataSource |
Vordefinierte DataSource bei der nur eine Verbindung mit der Datenbank hergestellt wird. Aufrufe von
close() werden ignoriert. Verbindung wird erst beim Zerstören der Instanz geschlossen. |
DriverManagerDataSource |
Erstellt Verbindung mit angegebenen Treiber. Bei jedem Zugriff wird einen neue Verbindung hergestellt. |
TransactionAwareDataSourceProxy |
Proxy, der eine echte DataSource ummantelt um Transaktionsmanagment in Form von Commits und Rollbacks zu
realisieren. |
DataSourceTransactionManager | Transaktionsmanagment-fähige Implementation. |
SingleConnectionDataSource
, die allerdings nicht Thread-sicher ist. Später sollte
die DriverManagerDataSource
genutzt und gegebenenfalls mit dem DataSourceTransactionManager
ummantelt werden.
support
support
ermöglicht das Übersetzen von SQL-Exception zu DataAccessException
. Spring bietet
eine umfangreichere Hierarchie für Exceptions beim Datenbankenzugriff als JDBC. Mithilfe dieser Hierarchie ist es möglich
differenzierter auf Exceptions einzugehen. Die Umwandlung der Fehler erfolgt bei der Nutzung des JdbcTemplate
automatisch. Es ist über das Erweitern der Klasse SQLErrorCodeSQLExceptionTranslator
auch möglich die Umwandlung
der Fehler eigenen Bedürfnissen anzupassen.
object
MappingSqlQuery
, in welcher der Konstruktor sowie
die Methode mapRow
implementiert werden müssen. Eine vollständige Implementierung könnte folgendermaßen
aussehen:
import org.springframework.jdbc.object.MappingSqlQuery; private class KundeMappingQuery extends MappingSqlQuery { public KundeMappingQuery(DataSource ds) { super(ds, "SELECT id, name FROM mytable"); compile(); } public Object mapRow(ResultSet rs, int rowNumber) throws SQLException { Kunde kunde = new Kunde(); kunde.setId((Integer) rs.getObject("id")); kunde.setName(rs.getString("name")); return kunde; } }Hier wird eine Abfrage und die Umwandlung einer Ergebniszeile in ein Objekt beschrieben.
public List getKunden() { KundeMappingQuery kundeQuery = new KundeMappingQuery(dataSource); List kunden = kundeQuery.execute(); return kunden; }
DataAccessExceptions
und die Möglichkeit ein
Transaktionsmanagment um das O/R mapping zu erzeugen.
web.xml
angegeben. Das DispatcherServlet sucht dann automatisch nach einer XML-Datei mit dem Namen
des Containers erweitert um -servlet.xml
und erzeugt den Container entsprechend dieser Datei.
<web-app> <servlet> <servlet-name>name_des_containers</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>name_des_containers</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>In der Konfiguration des Containers gibt es eine von
HandlerMapping
erbende Bean. Diese
Bean übernimmt die Zuweisung eines Requests zu einer Bean die das Controller
-Interface implementieren.
Spring bietet vorgefertigte HandlerMapping
s. So leitet zum Beispiel das SimpleUrlHandlerMapping
Anfragen an die Bean mit dem gleichen Namen wie die Anfrage. Eine Anfrage an kundeCreate.html
wird so an die Bean
kundeCreateController
weitergeleitet. Im Controller
-Interface ist die Methode
handleRequest
definiert, deren Parameter der Request ist und die ein ModelAndView
-Objekt
zurückgibt. Anhand dieses Objektes wird über eine, das Inteface ViewResolver
implementierende Bean, der
benötigte View ermittelt und das Model an diesen weitergegeben. Spring bietet vorgefertige ViewResolver
an. So
wird in dem UrlBasedViewResolver
der Name des Views als Dateiname des Views angenommen, gegebenenfalls mit Pre-
und Suffix versehen und diesem View das Model übergeben. Der View erzeugt dann aus dem Model die Ausgabe.lang:jruby
, lang:groovy
und lang:bsh
. Es ist auch möglich die in dynamischen
Sprachen geschriebenen Programmteile in dem Tag lang:inline-script
inline in der XML-Konfiguration zu
programmieren. Dadruch wird die Konfigurationsdatei allerdings leicht unübersichtlich.