Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer De Database aan Onze Applicatie Toevoegen | Werken Met Databases
Spring Boot Backend

bookDe Database aan Onze Applicatie Toevoegen

In het vorige hoofdstuk hebben we besproken wat JPA en Hibernate zijn. In dit hoofdstuk integreren we een database in onze applicatie en voeren we CRUD-bewerkingen uit (Create, Read, Update, Delete).

Voorbeeld van werken met een database:

Modelaanpassing

Het eerste wat we moeten doen is het model annoteren zodat Hibernate ermee kan werken en kan begrijpen bij welke tabel het hoort.

Book.java

Book.java

copy
12345678910
@Getter @Setter @Entity(name = "book") @Table(name = "book") public class Book { private String id; private String name; private String author; private String price; }

In de @Entity(name = "books") annotatie maakt de name parameter het mogelijk om de naam van de entiteit te specificeren, wat standaard de naam van de klasse is.

De @Table annotatie wordt gebruikt om specifieke instellingen voor de tabel die aan de entiteit is gekoppeld te specificeren.

In ons geval wordt deze tabel aangemaakt via migraties, dus hoeven we deze niet handmatig aan te maken.

We hebben ook nodig dat onze entiteit automatisch een ID genereert om een unieke waarde toe te wijzen in de database. Hiervoor kunnen we de @Id annotatie gebruiken op het veld dat ons ID voorstelt, samen met de @GeneratedValue annotatie.

@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;

De annotaties @Id en @GeneratedValue(strategy = GenerationType.UUID) geven aan dat het id-veld een primaire sleutel is die automatisch wordt gegenereerd in UUID-formaat.

Hierdoor worden unieke tekenreeksidentificaties voor elk record in de tabel gegarandeerd, wat voordelig is voor gedistribueerde systemen en wereldwijde uniciteit van de identificaties waarborgt. UUID's worden opgeslagen als strings.

Repository toevoegen

Op dit moment simuleert onze repository een database door alle entiteiten op te slaan in een List. Maar wat als ik je vertel dat het gebruik van een echte database eigenlijk veel eenvoudiger is!

Om te interageren met een echte database, kunnen we de JpaRepository interface gebruiken, die een breed scala aan ingebouwde methoden biedt voor het werken met gegevens.

BookRepository.java

BookRepository.java

copy
1234
@Repository public interface BookRepository extends JpaRepository<Book, String> { // JpaRepository already provides methods for CRUD operations }

In JpaRepository<Book, String> geven we twee parameters door: Book, dat het entiteitstype vertegenwoordigt waarmee de repository zal werken, en String, dat het gegevenstype is van de primaire sleutel (ID) voor de Book entiteit.

En dat is alles wat we nodig hebben! Nu hebben we een volledig functionele repository!

Belangrijkste Methoden van JpaRepository

Aangepaste SQL-query's maken

Spring Data JPA kan automatisch queries genereren als de methode wordt benoemd volgens een patroon dat overeenkomt met de datastructuur. Dit gebeurt met behulp van specifieke sleutelwoorden die aangeven hoe de query moet worden opgebouwd.

Korte samenvatting van de video

List<Book> findBookByAuthor(String author);

Deze methode genereert automatisch een SQL-query die zoekt naar alle boeken van de opgegeven author. De gegenereerde query ziet er als volgt uit:

SELECT * FROM book WHERE author = ?;

Hoe het werkt

De methodenaam findBookByAuthor(String author) is opgebouwd als volgt: deze begint met het voorvoegsel findBook, wat aangeeft dat de methode een zoekopdracht uitvoert. Daarna volgt ByAuthor, wat verwijst naar het veld in de Book-entiteit dat gebruikt wordt voor de zoekopdracht.

Wanneer deze methode wordt aangeroepen, genereert Spring Data JPA automatisch een query die zoekt naar records waarbij het author-veld overeenkomt met de meegegeven parameter.

SQL-query's genereren met de @Query

De @Query-annotatie in Spring Data JPA maakt het mogelijk om zowel JPQL als native SQL te gebruiken, wat flexibiliteit biedt bij het kiezen van de juiste benadering.

JPQL

JPQL (Java Persistence Query Language) werkt met objecten en hun eigenschappen.

@Query("SELECT b FROM book b WHERE b.author = :author")
List<Book> findBookByAuthor(String author);

Deze query zoekt naar alle Book objecten waarbij het author veld overeenkomt met de opgegeven waarde. JPQL is abstracter en weerspiegelt de structuur van het datamodel.

Native SQL

Native SQL werkt direct samen met databasetabellen.

@Query(value = "SELECT * FROM books WHERE author = :author", nativeQuery = true)
List<Book> findBookByAuthor(String author);

In dit geval werkt de query op de table book, waardoor het gebruik van specifieke SQL-functies en optimalisaties mogelijk is.

Een aanpak kiezen

Indien een eenvoudige query nodig is die overeenkomt met het datamodel, gebruik JPQL. Wanneer een complexe query of database-specifieke functies vereist zijn, kies dan voor native SQL.

Hierdoor biedt @Query de flexibiliteit om eenvoudig te schakelen tussen beide benaderingen, afhankelijk van de behoefte.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 5

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Suggested prompts:

Can you explain the difference between JPQL and native SQL in more detail?

How do I create a custom query using the @Query annotation?

What are some best practices for naming repository methods in Spring Data JPA?

Awesome!

Completion rate improved to 3.45

bookDe Database aan Onze Applicatie Toevoegen

Veeg om het menu te tonen

In het vorige hoofdstuk hebben we besproken wat JPA en Hibernate zijn. In dit hoofdstuk integreren we een database in onze applicatie en voeren we CRUD-bewerkingen uit (Create, Read, Update, Delete).

Voorbeeld van werken met een database:

Modelaanpassing

Het eerste wat we moeten doen is het model annoteren zodat Hibernate ermee kan werken en kan begrijpen bij welke tabel het hoort.

Book.java

Book.java

copy
12345678910
@Getter @Setter @Entity(name = "book") @Table(name = "book") public class Book { private String id; private String name; private String author; private String price; }

In de @Entity(name = "books") annotatie maakt de name parameter het mogelijk om de naam van de entiteit te specificeren, wat standaard de naam van de klasse is.

De @Table annotatie wordt gebruikt om specifieke instellingen voor de tabel die aan de entiteit is gekoppeld te specificeren.

In ons geval wordt deze tabel aangemaakt via migraties, dus hoeven we deze niet handmatig aan te maken.

We hebben ook nodig dat onze entiteit automatisch een ID genereert om een unieke waarde toe te wijzen in de database. Hiervoor kunnen we de @Id annotatie gebruiken op het veld dat ons ID voorstelt, samen met de @GeneratedValue annotatie.

@Id
@GeneratedValue(strategy = GenerationType.UUID)
private String id;

De annotaties @Id en @GeneratedValue(strategy = GenerationType.UUID) geven aan dat het id-veld een primaire sleutel is die automatisch wordt gegenereerd in UUID-formaat.

Hierdoor worden unieke tekenreeksidentificaties voor elk record in de tabel gegarandeerd, wat voordelig is voor gedistribueerde systemen en wereldwijde uniciteit van de identificaties waarborgt. UUID's worden opgeslagen als strings.

Repository toevoegen

Op dit moment simuleert onze repository een database door alle entiteiten op te slaan in een List. Maar wat als ik je vertel dat het gebruik van een echte database eigenlijk veel eenvoudiger is!

Om te interageren met een echte database, kunnen we de JpaRepository interface gebruiken, die een breed scala aan ingebouwde methoden biedt voor het werken met gegevens.

BookRepository.java

BookRepository.java

copy
1234
@Repository public interface BookRepository extends JpaRepository<Book, String> { // JpaRepository already provides methods for CRUD operations }

In JpaRepository<Book, String> geven we twee parameters door: Book, dat het entiteitstype vertegenwoordigt waarmee de repository zal werken, en String, dat het gegevenstype is van de primaire sleutel (ID) voor de Book entiteit.

En dat is alles wat we nodig hebben! Nu hebben we een volledig functionele repository!

Belangrijkste Methoden van JpaRepository

Aangepaste SQL-query's maken

Spring Data JPA kan automatisch queries genereren als de methode wordt benoemd volgens een patroon dat overeenkomt met de datastructuur. Dit gebeurt met behulp van specifieke sleutelwoorden die aangeven hoe de query moet worden opgebouwd.

Korte samenvatting van de video

List<Book> findBookByAuthor(String author);

Deze methode genereert automatisch een SQL-query die zoekt naar alle boeken van de opgegeven author. De gegenereerde query ziet er als volgt uit:

SELECT * FROM book WHERE author = ?;

Hoe het werkt

De methodenaam findBookByAuthor(String author) is opgebouwd als volgt: deze begint met het voorvoegsel findBook, wat aangeeft dat de methode een zoekopdracht uitvoert. Daarna volgt ByAuthor, wat verwijst naar het veld in de Book-entiteit dat gebruikt wordt voor de zoekopdracht.

Wanneer deze methode wordt aangeroepen, genereert Spring Data JPA automatisch een query die zoekt naar records waarbij het author-veld overeenkomt met de meegegeven parameter.

SQL-query's genereren met de @Query

De @Query-annotatie in Spring Data JPA maakt het mogelijk om zowel JPQL als native SQL te gebruiken, wat flexibiliteit biedt bij het kiezen van de juiste benadering.

JPQL

JPQL (Java Persistence Query Language) werkt met objecten en hun eigenschappen.

@Query("SELECT b FROM book b WHERE b.author = :author")
List<Book> findBookByAuthor(String author);

Deze query zoekt naar alle Book objecten waarbij het author veld overeenkomt met de opgegeven waarde. JPQL is abstracter en weerspiegelt de structuur van het datamodel.

Native SQL

Native SQL werkt direct samen met databasetabellen.

@Query(value = "SELECT * FROM books WHERE author = :author", nativeQuery = true)
List<Book> findBookByAuthor(String author);

In dit geval werkt de query op de table book, waardoor het gebruik van specifieke SQL-functies en optimalisaties mogelijk is.

Een aanpak kiezen

Indien een eenvoudige query nodig is die overeenkomt met het datamodel, gebruik JPQL. Wanneer een complexe query of database-specifieke functies vereist zijn, kies dan voor native SQL.

Hierdoor biedt @Query de flexibiliteit om eenvoudig te schakelen tussen beide benaderingen, afhankelijk van de behoefte.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 5
some-alt