Introduzione a Spring Data JDBC

1. Panoramica

Spring Data JDBC è un framework di persistenza non complesso come Spring Data JPA. Non fornisce cache, caricamento lento, write-behind o molte altre funzionalità di JPA. Tuttavia, ha il proprio ORM e fornisce la maggior parte delle funzionalità che utilizziamo con Spring Data JPA come entità mappate, repository, annotazioni di query e JdbcTemplate .

Una cosa importante da tenere a mente è che Spring Data JDBC non offre la generazione di schemi . Di conseguenza, siamo responsabili della creazione esplicita dello schema.

2. Aggiunta di Spring Data JDBC al progetto

Spring Data JDBC è disponibile per le applicazioni Spring Boot con lo starter delle dipendenze JDBC. Tuttavia, questo avviatore di dipendenza non porta il driver del database . Tale decisione deve essere presa dallo sviluppatore. Aggiungiamo lo starter delle dipendenze per Spring Data JPA:

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

In questo esempio, stiamo usando il database H2. Come accennato in precedenza, Spring Data JDBC non offre la generazione di schemi. In tal caso, possiamo creare un file schema.sql personalizzato che conterrà i comandi SQL DDL per la creazione degli oggetti schema. Automaticamente, Spring Boot selezionerà questo file e lo utilizzerà per creare oggetti di database.

3. Aggiunta di entità

Come con gli altri progetti Spring Data, utilizziamo le annotazioni per mappare i POJO con le tabelle del database. In Spring Data JDBC, l'entità deve avere un @Id . Spring Data JDBC utilizza l' annotazione @Id per identificare le entità.

Simile a Spring Data JPA, Spring Data JDBC utilizza, per impostazione predefinita, una strategia di denominazione che mappa le entità Java alle tabelle del database relazionale e gli attributi ai nomi delle colonne. Per impostazione predefinita, i nomi Camel Case delle entità e degli attributi vengono mappati rispettivamente ai nomi dei casi snake di tabelle e colonne. Ad esempio, un'entità Java denominata AddressBook viene mappata a una tabella di database denominata address_book .

Inoltre, possiamo mappare entità e attributi con tabelle e colonne in modo esplicito utilizzando le annotazioni @Table e @Column . Ad esempio, di seguito abbiamo definito l'entità che useremo in questo esempio:

public class Person { @Id private long id; private String firstName; private String lastName; // constructors, getters, setters }

Non è necessario utilizzare l'annotazione @Table o @Column nella classe Person . La strategia di denominazione predefinita di Spring Data JDBC esegue tutte le mappature implicitamente tra l'entità e la tabella.

4. Dichiarazione dei repository JDBC

Spring Data JDBC utilizza una sintassi simile a Spring Data JPA. Possiamo creare un repository JDBC Spring Data estendendo l' interfaccia Repository , CrudRepository o PagingAndSortingRepository . Implementando CrudRepository , riceviamo l'implementazione dei metodi più comunemente usati come save , delete e findById , tra gli altri.

Creiamo un repository JDBC che useremo nel nostro esempio:

@Repository public interface PersonRepository extends CrudRepository { }

Se abbiamo bisogno di funzioni di impaginazione e ordinamento, la scelta migliore sarebbe estendere l' interfaccia PagingAndSortingRepository .

5. Personalizzazione dei repository JDBC

Nonostante i metodi incorporati di CrudRepository , dobbiamo creare i nostri metodi per casi specifici. Una cosa importante da notare è che Spring Data JDBC non supporta le query derivate . Ciò significa che non possiamo semplicemente scrivere il nome del metodo e aspettarci che Spring Data JDBC generi la query.

Ogni volta che scriviamo un metodo personalizzato, dobbiamo decorarlo con l' annotazione @Query . All'interno dell'annotazione @Query , aggiungiamo il nostro comando SQL. In Spring Data JDBC, scriviamo query in semplice SQL. Non usiamo alcun linguaggio di query di livello superiore come JPQL. Di conseguenza, l'applicazione diventa strettamente collegata al fornitore del database.

Per questo motivo, diventa anche più difficile passare a un database diverso.

Un'altra importante differenza è che Spring Data JDBC non supporta il riferimento a parametri con numeri di indice . In questa versione di Spring Data JDBC, siamo in grado di fare riferimento ai parametri solo per nome .

Con l' annotazione @Modifying , possiamo annotare i metodi di query che modificano l'entità.

Ora personalizziamo il nostro PersonRepository con una query non modificante e una query modificante:

@Repository public interface PersonRepository extends 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") Long id, @Param("name") String name); }

6. Popolamento del database

Infine, dobbiamo popolare il database con i dati che serviranno per testare il repository JDBC Spring Data che abbiamo creato sopra. Quindi, creeremo una seminatrice di database che inserirà dati fittizi. Aggiungiamo l'implementazione del seeder di database per questo esempio:

@Component public class DatabaseSeeder { @Autowired private JdbcTemplate jdbcTemplate; public void insertData() { jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Victor', 'Hugo')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Dante', 'Alighieri')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Stefan', 'Zweig')"); jdbcTemplate.execute("INSERT INTO Person(first_name,last_name) VALUES('Oscar', 'Wilde')"); } }

Come visto sopra, stiamo usando Spring JDBC per eseguire le istruzioni INSERT . In particolare, Spring JDBC gestisce la connessione con il database e ci consente di eseguire comandi SQL utilizzando JdbcTemplate s. Questa soluzione è molto flessibile perché abbiamo il controllo completo sulle query eseguite.

7. Conclusione

Per riassumere, Spring Data JDBC offre una soluzione semplice come usare Spring JDBC: non c'è magia dietro di essa. Tuttavia, offre anche la maggior parte delle funzionalità che siamo abituati a utilizzare Spring Data JPA.

Uno dei maggiori vantaggi di Spring Data JDBC è il miglioramento delle prestazioni durante l'accesso al database rispetto a Spring Data JPA. Ciò è dovuto al fatto che Spring Data JDBC comunica direttamente al database . Spring Data JDBC non contiene la maggior parte della magia di Spring Data durante l'interrogazione del database .

Uno dei maggiori svantaggi quando si utilizza Spring Data JDBC è la dipendenza dal fornitore del database. Se decidiamo di cambiare il database da MySQL a Oracle, potremmo dover affrontare problemi che derivano da database con dialetti diversi .

L'implementazione di questo tutorial JDBC di Spring Data può essere trovata su GitHub.