Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Tilføj Databasen til Vores Applikation | Arbejde med Databaser
Spring Boot Backend

bookTilføj Databasen til Vores Applikation

I det forrige kapitel gennemgik vi, hvad JPA og Hibernate er. I dette kapitel vil vi integrere en database i vores applikation og forsøge at udføre CRUD-operationer (Create, Read, Update, Delete).

Eksempel på arbejde med en database:

Tilpasning af model

Det første vi skal gøre, er at annotere modellen, så Hibernate kan arbejde med den og forstå, hvilken tabel den tilhører.

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; }

I @Entity(name = "books") annotationen giver name-parameteren mulighed for at angive navnetentiteten, hvilket standardmæssigt er klassens navn.

@Table-annotationen bruges til at angive specifikke indstillinger for den tabel, der er tilknyttet entiteten.

I vores tilfælde oprettes denne tabel via migrationer, så vi behøver ikke at oprette den manuelt.

Vi har også brug for, at vores entitet automatisk genererer et ID for at tildele det en unik værdi i databasen. For at opnå dette kan vi bruge @Id annotationen på feltet, der repræsenterer vores ID, sammen med @GeneratedValue annotationen.

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

Annotationerne @Id og @GeneratedValue(strategy = GenerationType.UUID) angiver, at id-feltet er en primær nøgle, der automatisk genereres i UUID-format.

Dette sikrer unikke streng-identifikatorer for hver post i tabellen, hvilket er fordelagtigt for distribuerede systemer og garanterer global entydighed af identifikatorerne. UUID'er gemmes som strenge.

Tilføjelse af repository

I øjeblikket simulerer vores repository en database ved at gemme alle entiteter i en List. Men hvad nu hvis jeg fortalte dig, at det faktisk er meget nemmere at bruge en rigtig database!

For at interagere med en rigtig database kan vi bruge JpaRepository-interfacet, som tilbyder et bredt udvalg af indbyggede metoder til at arbejde med data.

BookRepository.java

BookRepository.java

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

I JpaRepository<Book, String> angiver vi to parametre: Book, som repræsenterer entitetstypen, som repositoryen skal arbejde med, og String, som er datatypen for primærnøglen (ID) for Book-entiteten.

Og det er alt, hvad vi behøver! Nu har vi et fuldt funktionelt repository!

JpaRepository Hovedmetoder

Oprettelse af brugerdefinerede SQL-forespørgsler

Spring Data JPA kan automatisk generere forespørgsler, hvis metoden navngives efter et mønster, der matcher datastrukturen. Dette gøres ved hjælp af specifikke nøgleord, som angiver, hvordan forespørgslen skal konstrueres.

Kort opsummering af videoen

List<Book> findBookByAuthor(String author);

Denne metode genererer automatisk en SQL-forespørgsel, der søger efter alle bøger af den angivne author. Den genererede forespørgsel vil se sådan ud:

SELECT * FROM book WHERE author = ?;

Sådan fungerer det

Metodenavnet findBookByAuthor(String author) er konstrueret således: det starter med præfikset findBook, hvilket angiver, at metoden udfører en søgning. Dernæst kommer ByAuthor, som repræsenterer feltet i Book-entiteten, der bruges til søgningen.

Når denne metode kaldes, genererer Spring Data JPA automatisk en forespørgsel, der søger efter poster, hvor author-feltet matcher den angivne parameter.

Generering af SQL-forespørgsler med @Query

@Query-annotationen i Spring Data JPA giver mulighed for at anvende både JPQL og native SQL, hvilket giver fleksibilitet i valget af den passende tilgang.

JPQL

JPQL (Java Persistence Query Language) arbejder med objekter og deres egenskaber.

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

Denne forespørgsel søger efter alle Book objekter, hvor author feltet matcher den angivne værdi. JPQL er mere abstrakt og afspejler datamodellens struktur.

Native SQL

Native SQL interagerer direkte med databasetabeller.

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

I dette tilfælde opererer forespørgslenbook-tabellen, hvilket muliggør brug af specifikke SQL-funktioner og optimeringer.

Valg af tilgang

Hvis du har brug for en simpel forespørgsel, der matcher datamodellen, skal du bruge JPQL. Hvis der kræves en kompleks forespørgsel eller databasespecifikke funktioner, skal du vælge native SQL.

Dermed giver @Query fleksibilitet til nemt at skifte mellem de to tilgange afhængigt af dine behov.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 5

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

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

bookTilføj Databasen til Vores Applikation

Stryg for at vise menuen

I det forrige kapitel gennemgik vi, hvad JPA og Hibernate er. I dette kapitel vil vi integrere en database i vores applikation og forsøge at udføre CRUD-operationer (Create, Read, Update, Delete).

Eksempel på arbejde med en database:

Tilpasning af model

Det første vi skal gøre, er at annotere modellen, så Hibernate kan arbejde med den og forstå, hvilken tabel den tilhører.

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; }

I @Entity(name = "books") annotationen giver name-parameteren mulighed for at angive navnetentiteten, hvilket standardmæssigt er klassens navn.

@Table-annotationen bruges til at angive specifikke indstillinger for den tabel, der er tilknyttet entiteten.

I vores tilfælde oprettes denne tabel via migrationer, så vi behøver ikke at oprette den manuelt.

Vi har også brug for, at vores entitet automatisk genererer et ID for at tildele det en unik værdi i databasen. For at opnå dette kan vi bruge @Id annotationen på feltet, der repræsenterer vores ID, sammen med @GeneratedValue annotationen.

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

Annotationerne @Id og @GeneratedValue(strategy = GenerationType.UUID) angiver, at id-feltet er en primær nøgle, der automatisk genereres i UUID-format.

Dette sikrer unikke streng-identifikatorer for hver post i tabellen, hvilket er fordelagtigt for distribuerede systemer og garanterer global entydighed af identifikatorerne. UUID'er gemmes som strenge.

Tilføjelse af repository

I øjeblikket simulerer vores repository en database ved at gemme alle entiteter i en List. Men hvad nu hvis jeg fortalte dig, at det faktisk er meget nemmere at bruge en rigtig database!

For at interagere med en rigtig database kan vi bruge JpaRepository-interfacet, som tilbyder et bredt udvalg af indbyggede metoder til at arbejde med data.

BookRepository.java

BookRepository.java

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

I JpaRepository<Book, String> angiver vi to parametre: Book, som repræsenterer entitetstypen, som repositoryen skal arbejde med, og String, som er datatypen for primærnøglen (ID) for Book-entiteten.

Og det er alt, hvad vi behøver! Nu har vi et fuldt funktionelt repository!

JpaRepository Hovedmetoder

Oprettelse af brugerdefinerede SQL-forespørgsler

Spring Data JPA kan automatisk generere forespørgsler, hvis metoden navngives efter et mønster, der matcher datastrukturen. Dette gøres ved hjælp af specifikke nøgleord, som angiver, hvordan forespørgslen skal konstrueres.

Kort opsummering af videoen

List<Book> findBookByAuthor(String author);

Denne metode genererer automatisk en SQL-forespørgsel, der søger efter alle bøger af den angivne author. Den genererede forespørgsel vil se sådan ud:

SELECT * FROM book WHERE author = ?;

Sådan fungerer det

Metodenavnet findBookByAuthor(String author) er konstrueret således: det starter med præfikset findBook, hvilket angiver, at metoden udfører en søgning. Dernæst kommer ByAuthor, som repræsenterer feltet i Book-entiteten, der bruges til søgningen.

Når denne metode kaldes, genererer Spring Data JPA automatisk en forespørgsel, der søger efter poster, hvor author-feltet matcher den angivne parameter.

Generering af SQL-forespørgsler med @Query

@Query-annotationen i Spring Data JPA giver mulighed for at anvende både JPQL og native SQL, hvilket giver fleksibilitet i valget af den passende tilgang.

JPQL

JPQL (Java Persistence Query Language) arbejder med objekter og deres egenskaber.

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

Denne forespørgsel søger efter alle Book objekter, hvor author feltet matcher den angivne værdi. JPQL er mere abstrakt og afspejler datamodellens struktur.

Native SQL

Native SQL interagerer direkte med databasetabeller.

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

I dette tilfælde opererer forespørgslenbook-tabellen, hvilket muliggør brug af specifikke SQL-funktioner og optimeringer.

Valg af tilgang

Hvis du har brug for en simpel forespørgsel, der matcher datamodellen, skal du bruge JPQL. Hvis der kræves en kompleks forespørgsel eller databasespecifikke funktioner, skal du vælge native SQL.

Dermed giver @Query fleksibilitet til nemt at skifte mellem de to tilgange afhængigt af dine behov.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 5
some-alt