Inleiding tot Spring Data JDBC

1. Overzicht

Spring Data JDBC is een persistentiekader dat niet zo complex is als Spring Data JPA. Het biedt geen cache, lazy loading, write-behind of vele andere functies van JPA. Desalniettemin heeft het zijn eigen ORM en biedt het de meeste functies die we gebruiken met Spring Data JPA zoals toegewezen entiteiten, opslagplaatsen, annotaties van query's en JdbcTemplate.

Een belangrijk ding om in gedachten te houden is dat Spring Data JDBC biedt geen schema-generatie. Als gevolg hiervan zijn we verantwoordelijk voor het expliciet maken van het schema.

2. Spring Data JDBC aan het project toevoegen

Spring Data JDBC is beschikbaar voor Spring Boot-applicaties met de JDBC-afhankelijkheidsstarter. Deze afhankelijkheidsstarter brengt echter niet het databasestuurprogramma. Die beslissing moet worden genomen door de ontwikkelaar. Laten we de afhankelijkheidsstarter voor Spring Data JPA toevoegen:

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

In dit voorbeeld gebruiken we de H2-database. Zoals we al eerder zeiden, biedt Spring Data JDBC geen schema-generatie. In dat geval kunnen we een custom schema.sql bestand met de SQL DDL-opdrachten voor het maken van de schema-objecten. Spring Boot kiest dit bestand automatisch en gebruikt het voor het maken van databaseobjecten.

3. Entiteiten toevoegen

Net als bij de andere Spring Data-projecten, gebruiken we annotaties om POJO's met databasetabellen in kaart te brengen. In Spring Data JDBC, de entiteit moet een @ID kaart. Spring Data JDBC gebruikt de @ID kaart annotatie om entiteiten te identificeren.

Net als Spring Data JPA gebruikt Spring Data JDBC standaard een naamgevingsstrategie die Java-entiteiten toewijst aan relationele databasetabellen en attributen aan kolomnamen. Standaard worden de Camel Case-namen van entiteiten en attributen toegewezen aan respectievelijk snake-case-namen van tabellen en kolommen. Bijvoorbeeld een Java-entiteit met de naam Adresboek is toegewezen aan een databasetabel met de naam adresboek.

We kunnen ook entiteiten en attributen met tabellen en kolommen expliciet toewijzen door de @Tafel en @Kolom annotaties. Hieronder hebben we bijvoorbeeld de entiteit gedefinieerd die we in dit voorbeeld gaan gebruiken:

openbare klasse Persoon {@Id lange privé-ID; private String voornaam; private String achternaam; // constructeurs, getters, setters}

We hoeven de annotatie niet te gebruiken @Tafel of @Kolom in de Persoon klasse. De standaardnaamstrategie van Spring Data JDBC doet alle toewijzingen impliciet tussen de entiteit en de tabel.

4. JDBC-repositories declareren

Spring Data JDBC gebruikt een syntaxis die vergelijkbaar is met Spring Data JPA. We kunnen een Spring Data JDBC-repository maken door het Opslagplaats, CrudRepository of PagingAndSortingRepository koppel. Door te implementeren CrudRepositoryontvangen we de implementatie van de meest gebruikte methoden zoals sparen, verwijderen, en findById, onder andere.

Laten we een JDBC-repository maken die we in ons voorbeeld gaan gebruiken:

@Repository openbare interface PersonRepository breidt CrudRepository uit {}

Als we paginering- en sorteerfuncties nodig hebben, is de beste keuze om het PagingAndSortingRepository koppel.

5. JDBC-opslagplaatsen aanpassen

Ondanks CrudRepository ingebouwde methoden, we moeten onze methoden voor specifieke gevallen creëren. Een belangrijk ding om op te merken is dat Spring Data JDBC ondersteunt geen afgeleide zoekopdrachten. Dit betekent dat we niet zomaar de naam van de methode kunnen schrijven en verwachten dat Spring Data JDBC de query genereert.

Elke keer dat we een aangepaste methode schrijven, moeten we deze versieren met de @Query annotatie. Binnen in de @Query annotatie, we voegen onze SQL-opdracht toe. In Spring Data JDBC schrijven we query's in gewone SQL. We gebruiken geen querytaal op een hoger niveau zoals JPQL. Als gevolg hiervan wordt de applicatie nauw verbonden met de databaseleverancier.

Om deze reden wordt het ook moeilijker om over te schakelen naar een andere database.

Een ander belangrijk verschil is dat Spring Data JDBC biedt geen ondersteuning voor het verwijzen naar parameters met indexnummers. In deze versie van Spring Data JDBC, we kunnen alleen op naam verwijzen naar parameters.

Met de @Wijzigen annotatie kunnen we querymethoden annoteren die de entiteit wijzigen.

Laten we nu onze PersonRepository met een niet-wijzigende zoekvraag en een wijzigende zoekvraag:

@Repository openbare interface PersonRepository breidt 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") Lange id, @Param ("name") Stringnaam); }

6. Het vullen van de database

Ten slotte moeten we de database vullen met gegevens die dienen voor het testen van de Spring Data JDBC-repository die we hierboven hebben gemaakt. We gaan dus een database-seeder maken die dummy-gegevens invoegt. Laten we de implementatie van database seeder toevoegen voor dit voorbeeld:

@Component openbare klasse DatabaseSeeder {@Autowired privé JdbcTemplate jdbcTemplate; public void insertData () {jdbcTemplate.execute ("INSERT INTO Person (voornaam, achternaam) VALUES ('Victor', 'Hugo')"); jdbcTemplate.execute ("INSERT INTO Person (voornaam, achternaam) VALUES ('Dante', 'Alighieri')"); jdbcTemplate.execute ("INSERT INTO Person (voornaam, achternaam) VALUES ('Stefan', 'Zweig')"); jdbcTemplate.execute ("INSERT INTO Person (voornaam, achternaam) VALUES ('Oscar', 'Wilde')"); }}

Zoals hierboven te zien is, gebruiken we Spring JDBC voor het uitvoeren van het INVOEGEN verklaringen. In het bijzonder zorgt Spring JDBC voor de verbinding met de database en kunnen we SQL-opdrachten uitvoeren met JdbcTemplates. Deze oplossing is zeer flexibel omdat we volledige controle hebben over de uitgevoerde queries.

7. Conclusie

Samenvattend biedt Spring Data JDBC een oplossing die net zo eenvoudig is als het gebruik van Spring JDBC - er zit geen magie achter. Desalniettemin biedt het ook de meeste functies die we gewend zijn met Spring Data JPA.

Een van de grootste voordelen van Spring Data JDBC zijn de verbeterde prestaties bij het openen van de database in vergelijking met Spring Data JPA. Dit komt door Spring Data JDBC communiceert rechtstreeks met de database. Spring Data JDBC bevat niet de meeste Spring Data-magie bij het doorzoeken van de database.

Een van de grootste nadelen bij het gebruik van Spring Data JDBC is de afhankelijkheid van de databaseleverancier. Als we besluiten om de database te veranderen van MySQL naar Oracle, we kunnen te maken krijgen met problemen die voortkomen uit databases met verschillende dialecten.

De implementatie van deze Spring Data JDBC-tutorial is te vinden op GitHub.