De 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
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
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.
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
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
De 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
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
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.
Bedankt voor je feedback!