Mit Java ins Web: Eine Spring-MVC-Anwendung im Detail, Teil 1
Seite 4: Datenbankanbindung
Anbindung der Datenbank über JPA
Für den Zugriff auf die Datenbank bietet Spring mit dem JDBC-Modul eine Basis-Implementierung an, zeitgemäßer ist aber ein automatisches Mapping auf das Basisobjekt City. Für das OR-Mapping lässt sich beispielsweise Hibernate einsetzen. Um auf die MySQL-Datenbank zuzugreifen, muss der Leser den Connector in der Maven-Konfiguration ergänzen:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
Folgende Basis-Einstellungen sind in src/main/resources/db.properties einzurichten:
db.username=root
db.password=
db.driver=com.mysql.jdbc.Driver
db.url=jdbc\:mysql\://localhost\:3306/world
db.dialect=org.hibernate.dialect.MySQLDialect
Die Werte für Nutzername / Passwort entsprechen den Default-Einstellungen nach der Installation von MySQL. In einer Produktivumgebung sind sie natürlich unbedingt zu ändern.
Die Eigenschaften lassen sich nun in src/main/webapp/WEB-INF/spring/db.xml nutzen:
<bean id="placeholderConfig"
class="org.springframework.beans.factory.config.
PropertyPlaceholderConfigurer">
<property name="location" value="classpath:db.properties" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.
LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.
HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="${db.dialect}" />
</bean>
</property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
<bean id="transactionManager"
class="org.springframework.orm.jpa.
JpaTransactionManager"></bean>
Erwähnt sei außerdem die Bean entityManagerFactory, die ein zentrales Objekt erstellt, das in der Anwendung alle Persistenz-Aktionen (Speichern, Löschen ...) durchführt.
Für das Mapping zwischen Datenbank-Tabelle und der Model-Klasse City sind deren Felder um einige Annotationen zu erweitern:
@Entity
@Table(name = "city")
public class City {
@Id
@GeneratedValue
@Column(name = "ID")
private Integer id;
@Column(name = "Name")
private String name;
@Column(name = "CountryCode")
private String country;
@Column(name = "District")
private String district;
@Column(name = "Population")
private String population;
// es folgen Getter und Setter ...
}
Für die eigentlichen Queries empfiehlt sich der Einsatz von Spring Data, womit sich die grundsätzlichen CRUD-Operationen leicht über JPA definieren lassen. Spring Data sieht dafür ein zentrales JPA-Repository vor, das bereits einige Basis-Methoden enthält (z. B. die Methode findAll()). Komplexere Queries können in JPA-Query-Syntax (also ähnlich wie SQL) als Annotationen über Methodenaufrufen in einem definierten Interface gesetzt werden – hier ein Beispiel für eine LIKE-Suche mit Wildcard:
public interface CityRepository extends JpaRepository<City, Long> {
@Query("from City where Name LIKE CONCAT(:currentName, '%')
order by ABS(Population) desc")
List<City> searchCity(@Param("currentName") String name);
}
Für das Speichern eines Datensatzes genügt ein simpler Aufruf der (direkt in der Library enthaltenen) Methode cityRepository.save(), der automatisch ein übergebenes Objekt in der Datenbank persistiert.
In der bisherigen Konfiguration ist Spring Data nicht enthalten, darum muss es in der Maven-Konfiguration ergänzt werden:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
Zwischenfazit
Damit haben Autor und geneigter Leser eine funktionstüchtige, aber noch nicht besonders ansprechende beziehungsweise benutzerfreundliche Anwendung geschrieben. Sie kann Städte aus der Datenbank anzeigen sowie nach Städten suchen, Städte entfernen und neue Städte hinzufügen. Die wesentliche Struktur einer MVC-Anwendung und die Implementierung in Spring 3 sollte damit erklärt sein.
Der zweite Artikel des Tutorials wird die rudimentäre Anwendung um zeitgemäße und sinnvolle Funktionen (Auto-Vervollständigung, Fehlerkorrektur) und eine verbesserte Darstellung ergänzen.
Jan Petzold
arbeitet als Senior-Softwareingenieur für Capgemini in Berlin.
Onlinequellen
- Eberhard Wolff; Spring 3 – Framework für die Java-Entwicklung; dpunkt.verlag 2010
- Eberhard Wolff; Spring 3 steht vor der Tür – ein erster Ausblick; Artikel auf heise developer
- Kai Wähner; Das gewisse Extra; Einsatz und Grenzen von Spring Roo; Artikel auf heise Developer
- Lars Vogel; Dependency Injection with the Spring Framework – Tutorial
- Martin Fowler; Inversion of Control Containers and the Dependency Injection pattern
- Spring-Dokumentation
(ane)