Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Aggiungere il Database alla Nostra Applicazione | Lavorare Con I Database
Spring Boot Backend

bookAggiungere il Database alla Nostra Applicazione

Nel capitolo precedente, abbiamo trattato cosa sono JPA e Hibernate. In questo capitolo, integreremo un database nella nostra applicazione e proveremo a eseguire operazioni CRUD (Create, Read, Update, Delete).

Esempio di utilizzo di un database:

Personalizzazione del modello

La prima cosa da fare è annotare il modello affinché Hibernate possa lavorare con esso e comprendere a quale tabella appartiene.

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

Nell'annotazione @Entity(name = "books"), il parametro name consente di specificare il nome dell'entità, che predefinitamente corrisponde al nome della classe.

L'annotazione @Table viene utilizzata per specificare impostazioni particolari per la tabella associata all'entità.

In questo caso, questa tabella viene creata tramite migrazioni, quindi non è necessario crearla manualmente.

È inoltre necessario che la nostra entità generi automaticamente un ID per assegnargli un valore univoco nel database. Per ottenere questo risultato, è possibile utilizzare l'annotazione @Id sul campo che rappresenta il nostro ID, insieme all'annotazione @GeneratedValue.

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

Le annotazioni @Id e @GeneratedValue(strategy = GenerationType.UUID) specificano che il campo id è una chiave primaria che viene generata automaticamente in formato UUID.

Questo garantisce identificatori univoci di tipo stringa per ogni record nella tabella, caratteristica vantaggiosa per i sistemi distribuiti e che assicura l'unicità globale degli identificatori. Gli UUID sono memorizzati come stringhe.

Aggiunta del Repository

Attualmente, il nostro repository simula un database memorizzando tutte le entità in una List. Ma se ti dicessi che utilizzare un vero database è in realtà molto più semplice!

Per interagire con un vero database, possiamo utilizzare l'interfaccia JpaRepository, che offre una vasta gamma di metodi integrati per lavorare con i dati.

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>, vengono passati due parametri: Book, che rappresenta il tipo di entità con cui il repository lavorerà, e String, che è il tipo di dato della chiave primaria (ID) per l'entità Book.

E questo è tutto ciò che serve! Ora abbiamo un repository completamente funzionante!

Metodi Principali di JpaRepository

Creazione di Query SQL Personalizzate

Spring Data JPA può generare automaticamente le query se il metodo è nominato secondo un pattern che si allinea con la struttura dei dati. Questo avviene utilizzando parole chiave specifiche che indicano come la query deve essere costruita.

Breve riepilogo del video

List<Book> findBookByAuthor(String author);

Questo metodo genera automaticamente una query SQL che cerca tutti i libri dello specifico author. La query generata sarà simile a questa:

SELECT * FROM book WHERE author = ?;

Come funziona

Il nome del metodo findBookByAuthor(String author) è costruito come segue: inizia con il prefisso findBook, che indica che il metodo esegue una ricerca. Successivamente viene ByAuthor, che rappresenta il campo nell'entità Book che verrà utilizzato per la ricerca.

Quando questo metodo viene chiamato, Spring Data JPA genera automaticamente una query che cerca i record in cui il campo author corrisponde al parametro fornito.

Generazione di query SQL con @Query

L'annotazione @Query in Spring Data JPA consente di utilizzare sia JPQL che SQL nativo, offrendo flessibilità nella scelta dell'approccio più appropriato.

JPQL

JPQL (Java Persistence Query Language) funziona con oggetti e le loro proprietà.

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

Questa query ricerca tutti gli oggetti Book in cui il campo author corrisponde al valore fornito. JPQL è più astratto e riflette la struttura del modello dati.

SQL Nativo

SQL nativo interagisce direttamente con le tabelle del database.

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

In questo caso, la query opera sulla tabella book, consentendo l'utilizzo di specifiche funzioni SQL e ottimizzazioni.

Scelta di un Approccio

Se è necessaria una query semplice che si allinea con il modello dati, utilizzare JPQL. Se è richiesta una query complessa o funzioni specifiche del database, scegliere SQL nativo.

Pertanto, @Query offre la flessibilità di passare facilmente tra i due approcci in base alle esigenze.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 5

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 3.45

bookAggiungere il Database alla Nostra Applicazione

Scorri per mostrare il menu

Nel capitolo precedente, abbiamo trattato cosa sono JPA e Hibernate. In questo capitolo, integreremo un database nella nostra applicazione e proveremo a eseguire operazioni CRUD (Create, Read, Update, Delete).

Esempio di utilizzo di un database:

Personalizzazione del modello

La prima cosa da fare è annotare il modello affinché Hibernate possa lavorare con esso e comprendere a quale tabella appartiene.

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

Nell'annotazione @Entity(name = "books"), il parametro name consente di specificare il nome dell'entità, che predefinitamente corrisponde al nome della classe.

L'annotazione @Table viene utilizzata per specificare impostazioni particolari per la tabella associata all'entità.

In questo caso, questa tabella viene creata tramite migrazioni, quindi non è necessario crearla manualmente.

È inoltre necessario che la nostra entità generi automaticamente un ID per assegnargli un valore univoco nel database. Per ottenere questo risultato, è possibile utilizzare l'annotazione @Id sul campo che rappresenta il nostro ID, insieme all'annotazione @GeneratedValue.

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

Le annotazioni @Id e @GeneratedValue(strategy = GenerationType.UUID) specificano che il campo id è una chiave primaria che viene generata automaticamente in formato UUID.

Questo garantisce identificatori univoci di tipo stringa per ogni record nella tabella, caratteristica vantaggiosa per i sistemi distribuiti e che assicura l'unicità globale degli identificatori. Gli UUID sono memorizzati come stringhe.

Aggiunta del Repository

Attualmente, il nostro repository simula un database memorizzando tutte le entità in una List. Ma se ti dicessi che utilizzare un vero database è in realtà molto più semplice!

Per interagire con un vero database, possiamo utilizzare l'interfaccia JpaRepository, che offre una vasta gamma di metodi integrati per lavorare con i dati.

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>, vengono passati due parametri: Book, che rappresenta il tipo di entità con cui il repository lavorerà, e String, che è il tipo di dato della chiave primaria (ID) per l'entità Book.

E questo è tutto ciò che serve! Ora abbiamo un repository completamente funzionante!

Metodi Principali di JpaRepository

Creazione di Query SQL Personalizzate

Spring Data JPA può generare automaticamente le query se il metodo è nominato secondo un pattern che si allinea con la struttura dei dati. Questo avviene utilizzando parole chiave specifiche che indicano come la query deve essere costruita.

Breve riepilogo del video

List<Book> findBookByAuthor(String author);

Questo metodo genera automaticamente una query SQL che cerca tutti i libri dello specifico author. La query generata sarà simile a questa:

SELECT * FROM book WHERE author = ?;

Come funziona

Il nome del metodo findBookByAuthor(String author) è costruito come segue: inizia con il prefisso findBook, che indica che il metodo esegue una ricerca. Successivamente viene ByAuthor, che rappresenta il campo nell'entità Book che verrà utilizzato per la ricerca.

Quando questo metodo viene chiamato, Spring Data JPA genera automaticamente una query che cerca i record in cui il campo author corrisponde al parametro fornito.

Generazione di query SQL con @Query

L'annotazione @Query in Spring Data JPA consente di utilizzare sia JPQL che SQL nativo, offrendo flessibilità nella scelta dell'approccio più appropriato.

JPQL

JPQL (Java Persistence Query Language) funziona con oggetti e le loro proprietà.

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

Questa query ricerca tutti gli oggetti Book in cui il campo author corrisponde al valore fornito. JPQL è più astratto e riflette la struttura del modello dati.

SQL Nativo

SQL nativo interagisce direttamente con le tabelle del database.

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

In questo caso, la query opera sulla tabella book, consentendo l'utilizzo di specifiche funzioni SQL e ottimizzazioni.

Scelta di un Approccio

Se è necessaria una query semplice che si allinea con il modello dati, utilizzare JPQL. Se è richiesta una query complessa o funzioni specifiche del database, scegliere SQL nativo.

Pertanto, @Query offre la flessibilità di passare facilmente tra i due approcci in base alle esigenze.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 5
some-alt