Einführung in Spring Data JDBC

1. Übersicht

Spring Data JDBC ist ein Persistenz-Framework, das nicht so komplex ist wie Spring Data JPA. Es bietet keinen Cache, kein verzögertes Laden, kein Zurückschreiben oder viele andere Funktionen von JPA. Trotzdem verfügt es über ein eigenes ORM und bietet die meisten Funktionen, die wir mit Spring Data JPA verwenden, wie zugeordnete Entitäten, Repositorys, Abfrageanmerkungen und JdbcTemplate .

Es ist wichtig zu beachten, dass Spring Data JDBC keine Schemaerstellung bietet . Daher sind wir dafür verantwortlich, das Schema explizit zu erstellen.

2. Hinzufügen von Spring Data JDBC zum Projekt

Spring Data JDBC steht Spring Boot-Anwendungen mit dem JDBC-Abhängigkeitsstarter zur Verfügung. Dieser Abhängigkeitsstarter bringt den Datenbanktreiber jedoch nicht . Diese Entscheidung muss vom Entwickler getroffen werden. Fügen wir den Abhängigkeitsstarter für Spring Data JPA hinzu:

 org.springframework.boot spring-boot-starter-data-jdbc  

In diesem Beispiel verwenden wir die H2-Datenbank. Wie bereits erwähnt, bietet Spring Data JDBC keine Schemaerstellung. In einem solchen Fall können wir eine benutzerdefinierte Datei schema.sql erstellen, die die SQL-DDL-Befehle zum Erstellen der Schemaobjekte enthält. Spring Boot wählt diese Datei automatisch aus und verwendet sie zum Erstellen von Datenbankobjekten.

3. Entitäten hinzufügen

Wie bei den anderen Spring Data-Projekten verwenden wir Anmerkungen, um POJOs mit Datenbanktabellen zuzuordnen. In Spring Data JDBC muss die Entität über eine @Id verfügen . Spring Data JDBC verwendet die Annotation @Id , um Entitäten zu identifizieren.

Ähnlich wie Spring Data JPA verwendet Spring Data JDBC standardmäßig eine Namensstrategie, mit der Java-Entitäten relationalen Datenbanktabellen und Attribute Spaltennamen zugeordnet werden. Standardmäßig werden die Kamelfallnamen von Entitäten und Attributen den Schlangenfallnamen von Tabellen bzw. Spalten zugeordnet. Beispielsweise wird eine Java-Entität mit dem Namen AddressBook einer Datenbanktabelle mit dem Namen address_book zugeordnet .

Außerdem können wir Entitäten und Attribute mit Tabellen und Spalten explizit zuordnen, indem wir die Annotationen @Table und @Column verwenden . Im Folgenden haben wir beispielsweise die Entität definiert, die in diesem Beispiel verwendet werden soll:

public class Person { @Id private long id; private String firstName; private String lastName; // constructors, getters, setters }

Wir müssen die Annotation @Table oder @Column in der Person- Klasse nicht verwenden. Die Standardbenennungsstrategie von Spring Data JDBC führt alle Zuordnungen implizit zwischen der Entität und der Tabelle durch.

4. Deklarieren von JDBC-Repositorys

Spring Data JDBC verwendet eine Syntax, die Spring Data JPA ähnelt. Wir können ein Spring Data JDBC-Repository erstellen , indem wir die Schnittstelle Repository , CrudRepository oder PagingAndSortingRepository erweitern . Durch die Implementierung von CrudRepository erhalten wir die Implementierung der am häufigsten verwendeten Methoden wie Speichern , Löschen und findById .

Erstellen wir ein JDBC-Repository, das wir in unserem Beispiel verwenden werden:

@Repository public interface PersonRepository extends CrudRepository { }

Wenn Paginierungs- und Sortierfunktionen erforderlich sind, ist es am besten, die PagingAndSortingRepository- Schnittstelle zu erweitern.

5. Anpassen von JDBC-Repositorys

Trotz der in CrudRepository integrierten Methoden müssen wir unsere Methoden für bestimmte Fälle erstellen. Eine wichtige Sache zu beachten ist, dass Spring Data JDBC abgeleitete Abfragen nicht unterstützt . Dies bedeutet, dass wir nicht einfach den Methodennamen schreiben können und erwarten, dass Spring Data JDBC die Abfrage generiert.

Jedes Mal, wenn wir eine benutzerdefinierte Methode schreiben, müssen wir sie mit der Annotation @Query dekorieren . In der Annotation @Query fügen wir unseren SQL-Befehl hinzu. In Spring Data JDBC schreiben wir Abfragen in einfachem SQL. Wir verwenden keine übergeordnete Abfragesprache wie JPQL. Infolgedessen wird die Anwendung eng mit dem Datenbankanbieter gekoppelt.

Aus diesem Grund wird es auch schwieriger, zu einer anderen Datenbank zu wechseln.

Ein weiterer wichtiger Unterschied besteht darin, dass Spring Data JDBC die Referenzierung von Parametern mit Indexnummern nicht unterstützt . In dieser Version von Spring Data JDBC können wir Parameter nur nach Namen referenzieren .

Mit der Annotation @Modifying können wir Abfragemethoden mit Annotationen versehen, die die Entität ändern.

Passen wir nun unser PersonRepository mit einer nicht modifizierenden Abfrage und einer modifizierenden Abfrage an:

@Repository public interface PersonRepository extends CrudRepository { @Query("select * from person where first_name=:firstName") List findByFirstName(@Param("firstName") String firstName); @Modifying @Query("UPDATE person SET first_name = :name WHERE id = :id") boolean updateByFirstName(@Param("id") Long id, @Param("name") String name); }

6. Auffüllen der Datenbank

Schließlich müssen wir die Datenbank mit Daten füllen, die zum Testen des oben erstellten Spring Data JDBC-Repositorys dienen. Also werden wir einen Datenbank-Seeder erstellen, der Dummy-Daten einfügt. Fügen wir für dieses Beispiel die Implementierung von Database Seeder hinzu:

@Component public class DatabaseSeeder { @Autowired private JdbcTemplate jdbcTemplate; public void insertData() { jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Victor', 'Hugo')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Dante', 'Alighieri')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Stefan', 'Zweig')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Oscar', 'Wilde')"); } }

Wie oben gezeigt, verwenden wir Spring JDBC zum Ausführen der INSERT- Anweisungen. Insbesondere übernimmt Spring JDBC die Verbindung mit der Datenbank und ermöglicht die Ausführung von SQL-Befehlen mit JdbcTemplate s. Diese Lösung ist sehr flexibel, da wir die vollständige Kontrolle über die ausgeführten Abfragen haben.

7. Fazit

Zusammenfassend bietet Spring Data JDBC eine Lösung, die so einfach ist wie die Verwendung von Spring JDBC - dahinter steckt keine Magie. Es bietet jedoch auch die meisten Funktionen, die wir von Spring Data JPA gewohnt sind.

Einer der größten Vorteile von Spring Data JDBC ist die verbesserte Leistung beim Zugriff auf die Datenbank im Vergleich zu Spring Data JPA. Dies liegt daran, dass Spring Data JDBC direkt mit der Datenbank kommuniziert . Spring Data JDBC enthält beim Abfragen der Datenbank nicht den größten Teil der Spring Data-Magie .

Einer der größten Nachteile bei der Verwendung von Spring Data JDBC ist die Abhängigkeit vom Datenbankanbieter. Wenn wir uns entscheiden, die Datenbank von MySQL auf Oracle zu ändern, müssen wir uns möglicherweise mit Problemen befassen, die sich aus Datenbanken mit unterschiedlichen Dialekten ergeben .

Die Implementierung dieses Spring Data JDBC-Tutorials finden Sie auf GitHub.