Mit Java ins Web: Eine Spring-MVC-Anwendung im Detail, Teil 1

Seite 4: Datenbankanbindung

Inhaltsverzeichnis

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>

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.

(ane)