Integrazione di Spring Boot con HSQLDB

1. Panoramica

Spring Boot rende davvero facile lavorare con diversi sistemi di database, senza il fastidio della gestione manuale delle dipendenze.

Più specificamente, lo starter Spring Data JPA fornisce tutte le funzionalità necessarie per una perfetta integrazione con diverse implementazioni DataSource .

In questo tutorial impareremo come integrare Spring Boot con HSQLDB .

2. Le dipendenze di Maven

Per dimostrare quanto sia facile integrare Spring Boot con HSQLDB, creeremo un semplice livello di repository JPA che esegue operazioni CRUD sulle entità dei clienti utilizzando un database HSQLDB in memoria .

Ecco lo starter Spring Boot che useremo per far funzionare il nostro livello di repository di esempio:

 org.springframework.boot spring-boot-starter-data-jpa 2.2.2.RELEASE org.hsqldb hsqldb 2.4.0 runtime 

Nota che abbiamo incluso anche la dipendenza HSQLDB. Senza di esso, Spring Boot proverà a configurare automaticamente un bean DataSource e un pool di connessioni JDBC per noi tramite HikariCP.

Di conseguenza, se non specifichiamo una dipendenza DataSource valida nel nostro file pom.xml , avremo un errore di compilazione .

Inoltre, assicuriamoci di controllare l'ultima versione di spring-boot-starter-data-jpa su Maven Central.

3. Connessione a un database HSQLDB

Per esercitare il nostro livello di repository demo, utilizzeremo un database in memoria. È possibile, tuttavia, lavorare anche con database basati su file. Esploreremo ciascuno di questi metodi nelle sezioni seguenti.

3.1. Esecuzione di un server HSQLDB esterno

Diamo un'occhiata a come far funzionare un server HSQLDB esterno e creare un database basato su file. L'installazione di HSQLDB e l'esecuzione del server è semplice, nel complesso.

Ecco i passaggi che dovremmo seguire:

  • Innanzitutto, scaricheremo HSQLDB e lo decomprimeremo in una cartella
  • Poiché HSQLDB non fornisce un database predefinito pronto all'uso , ne creeremo uno chiamato "testdb" per scopi di esempio
  • Avvieremo un prompt dei comandi e andremo alla cartella dei dati HSQLDB
  • All'interno della cartella dei dati , eseguiremo il seguente comando:
    java -cp ../lib/hsqldb.jar org.hsqldb.server.Server --database.0 file.testdb --dbname0.testdb
  • Il comando precedente avvierà il server HSQLDB e creerà il nostro database i cui file sorgente verranno archiviati nella cartella dei dati
  • Possiamo assicurarci che il database sia stato effettivamente creato andando nella cartella dei dati , che dovrebbe contenere una serie di file chiamati "testdb.lck" , "testdb.log" , "testdb.properties" e "testdb.script" ( il numero di file varia a seconda del tipo di database che stiamo creando)

Una volta che il database è stato impostato, dobbiamo creare una connessione ad esso.

Per fare ciò su Windows , andiamo nella cartella bin del database ed eseguiamo il file runManagerSwing.bat . Questo aprirà la schermata iniziale di HSQLDB Database Manager, dove possiamo inserire le credenziali di connessione:

  • Tipo: motore di database HSQL
  • URL: jdbc: hsqldb: hsql: // localhost / testdb
  • Utente: "SA" (amministratore di sistema)
  • Password: lasciare il campo vuoto

Su Linux / Unix / Mac , possiamo utilizzare NetBeans, Eclipse o IntelliJ IDEA per creare la connessione al database tramite gli strumenti visivi dell'IDE, utilizzando le stesse credenziali.

In uno qualsiasi di questi strumenti, è semplice creare una tabella di database eseguendo uno script SQL nel Database Manager o all'interno dell'IDE.

Una volta connessi, possiamo creare una tabella clienti :

CREATE TABLE customers ( id INT NOT NULL, name VARCHAR (45), email VARCHAR (45), PRIMARY KEY (ID) ); 

In pochi semplici passaggi, abbiamo creato un database HSQLDB basato su file contenente una tabella dei clienti .

3.2. Il file application.properties

Se desideriamo connetterci al database precedente basato su file da Spring Boot, ecco le impostazioni che dovremmo includere nel file application.properties :

spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver spring.datasource.url=jdbc:hsqldb:hsql://localhost/testdb spring.datasource.username=sa spring.datasource.password= spring.jpa.hibernate.ddl-auto=update 

In alternativa, se usiamo un database in memoria, dovremmo usarli:

spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver spring.datasource.url=jdbc:hsqldb:mem:testdb;DB_CLOSE_DELAY=-1 spring.datasource.username=sa spring.datasource.password= spring.jpa.hibernate.ddl-auto=create 

Notare il parametro DB_CLOSE_DELAY = -1 aggiunto alla fine dell'URL del database. Quando si lavora con un database in memoria, è necessario specificarlo, quindi l'implementazione JPA, che è Hibernate, non chiuderà il database mentre l'applicazione è in esecuzione .

4. L' entità cliente

Con le impostazioni di connessione al database già configurate, dobbiamo quindi definire la nostra entità Cliente :

@Entity @Table(name = "customers") public class Customer { @Id @GeneratedValue(strategy = GenerationType.AUTO) private long id; private String name; private String email; // standard constructors / setters / getters / toString } 

5. Il repository del cliente

Inoltre, dobbiamo implementare un sottile strato di persistenza, che ci consenta di avere funzionalità CRUD di base sulle nostre entità JPA del cliente .

Possiamo facilmente implementare questo livello semplicemente estendendo l' interfaccia di CrudRepository :

@Repository public interface CustomerRepository extends CrudRepository {}

6. Test del repository del cliente

Infine, dovremmo assicurarci che Spring Boot possa effettivamente connettersi a HSQLDB. Possiamo farlo facilmente testando il livello del repository.

Iniziamo a testare i metodi findById () e findAll () del repository :

@RunWith(SpringRunner.class) @SpringBootTest public class CustomerRepositoryTest { @Autowired private CustomerRepository customerRepository; @Test public void whenFindingCustomerById_thenCorrect() { customerRepository.save(new Customer("John", "[email protected]")); assertThat(customerRepository.findById(1L)).isInstanceOf(Optional.class); } @Test public void whenFindingAllCustomers_thenCorrect() { customerRepository.save(new Customer("John", "[email protected]")); customerRepository.save(new Customer("Julie", "[email protected]")); assertThat(customerRepository.findAll()).isInstanceOf(List.class); } } 

Infine, testiamo il metodo save () :

@Test public void whenSavingCustomer_thenCorrect() { customerRepository.save(new Customer("Bob", "[email protected]")); Customer customer = customerRepository.findById(1L).orElseGet(() -> new Customer("john", "[email protected]")); assertThat(customer.getName()).isEqualTo("Bob"); }

7. Conclusione

In this article, we learned how to integrate Spring Boot with HSQLDB, and how to use either a file-based or in-memory database in the development of a basic JPA repository layer.

As usual, all the code samples shown in this article are available over on GitHub.