Benvenuti in questo repository GitHub 🚀 che mostra un progetto Maven! che sfrutta l'efficacia di
H2DB, un R-DBMS scritto in Java.
H2 Database si presenta come un'alternativa ai R-DBMS tradizionali come
MySQL come sistema per lo storaging di Dati.
Questo progetto Maven si occupa in modo automatico del download delle dipendenze di H2, un database relazionale in scritto sul file PeopleDB.mv.db
.
Nel file principale dell'applicazione Main.java
, viene instaurata una connessione con il database.
Durante la prima esecuzione, dato che il database non esiste ancora, viene generato automaticamente utilizzando le credenziali predefinite, scelte dall'utente all'atto dell'instaurazione della connessione.
Considerando l'assenza di dati nel database, la tabella Person
viene create e popolata in conformità con le istruzioni specificate nel file PeopleDB.sql
.
Subito dopo, i risultati di una query vengono visualizzati a schermo.
Nella sua fase embrionale, il progetto combinava le capacità di Maven alla potenza di H2; successivamente, allo scopo di condurre analisi comparative, è stata intrapresa una rivisitazione per preparare il terreno per un'agevole adozione di MySQL in luogo di H2.
Per conferire un'ulteriore dimensione di fascino all'approccio, è stata abbandonata l'idea di installare strumenti onerosi come XAMPP o MySQL in ambiente locale ed è stato deciso di adottare un servizio online ospitato da db4free; la cui piattaforma permette, previa una registrazione, l'uso di un R-DBMS MySQL online.
Tale piattaforma seppur con qualche limitazione non ha però compromesso la natura didattica del progetto.
In un quadro riassuntivo:
- Nel file pom.xml, è stata inserito lo starter per la dipendenza per MySQL oltre ad H2; uno due starter può essere estromesso e/o rimosso rimosso nel caso non se ne faccia utilizzo.
- Il file PeopleDB.sql è stato sposato online.
- Nel corpo codice sono stateffettuate rivisitazioni mediante accorgimenti chirurgici su porzioni specifiche del codice volti a discriminare il database in uso.
Una delle sue caratteristiche distintive è la dimensione ridotta, poiché archivia l'intero database in un unico file con estensione .mv.db
, simile al funzionamento di SQLite.
Questa caratteristica non solo garantisce robustezza, ma anche la resilienza dell'intero sistema in caso di corruzione di un singolo db.
H2DB, analogamente a SQLite, si distingue per la sua versatilità e velocità. Questa agilità lo rende ideale per prototipare progetti. Una caratteristica unica è la capacità di mantenere l'intero database in memoria, ottimizzando le prestazioni a scapito della persistenza. Al riavvio del progetto, i dati vengono, optando per questa modalità, irrimediabilmente persi. Per far uso di questa modalità (in-memory storaging) basta scrivere nel codice Java il seguente codice:
Connection con = DriverManager.getConnection("jdbc:h2:mem:<db_name>", username, password);
Se invece si vuole puntare alla persistenza dei dati e al ripristino dei dati al riavvio dell'applicazione basta optare per la modalità classica (Embedded storaging) optando per il seguente codice:
Connection con = DriverManager.getConnection("jdbc:h2:<path_to_db_name>", username, password);
Analogamente nel caso in cui si faccia uso con un R-DBMS MySQL il codice invece si trasforma in:
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/<db_name>", username, password);
o analogamente nel caso in cui il DB sia ospitato online il codice relativo sarà:
Connection con = DriverManager.getConnection("jdbc:mysql://db4free.net:3306/<db_name>", username, password);
Il nome del database non comprende la sua estensione (quindi senza .mv.db
).
Per altre modalità di connessione consultare qui.
Essendo implementato in Java, H2DB è perfettamente integrato con il linguaggio, consentendo un approccio JDBC. Altri linguaggi possono sfruttare questo DBMS a patto di avere una JVM installata e il relativo connettore (sotto forma di file JAR).
Nonostante la sua semplicità, H2DB offre un'interfaccia web integrata e una shell testuale estremamente versatile.
L'interfaccia web è flessibile ma non supporta la creazione del file di database stesso. A tale scopo, si ricorre all'interfaccia da riga di comando che offre la possibilità di impostare caratteristiche avanzate.
Per avviare l'interfaccia web, utilizzare il seguente comando:
java -jar h2.*.jar
La GUI web sarà accessibile all'indirizzo http://localhost:8082. È possibile, inoltre, personalizzare le porte utilizzate con le opzioni seguenti:
java -jar h2.*.jar -webPort 5000 [-tcpPort 5001] [-pgPort 5002]
che avvia l'interfaccia web sulla porta 5000 ed eventualmente quella TCP 5001 e pg 5002
Come si può osservare l'interfaccia non è da meno alla classica interfaccia web phpMyAdmin di MySQL.
Se il database non esiste o vi è la necessità di impostare le credenziali di accesso al db, la CLI testuale è necessaria!
Per accedere ad essa si può adoperare il seguente comando:
java -cp h2.*.jar org.h2.tools.Shell
Questa interfaccia nel caso che il DB non esista, permetterà di crearlo e di settare in maniera avanzata tutte le credenziali; attraverso una serie di passaggi, sarà possibile scegliere a proprio piacimento username e password oltre che la posizione del db sul disco.
Questa interfaccia permetterà, inoltre, in caso di DB già esistente, di autenticarsi e successivamente operare in maniera professionale.
A differenza di MySQL, non è richiesto avviare un server H2 in un'istanza separata. Nel codice Java, è sufficiente richiamare:
org.h2.Driver.load(); // Carica il Server H2DB
// esegui operazioni
org.h2.Driver.unload(); // Ferma il Server H2DB
Il file pom.xml o Project Object Model è un file costruito da Maven e serve per gestire le dipendenze del progetto.
All'interno del file si può facilmente notare il seguente snippet
<groupId>pkg</groupId>
<artifactId>java.h2db.mvn</artifactId>
<version>1.0.0-alpha</version>
<description>Maven and H2DB</description>
dove:
grupId
rappresenta il package nel quale sono disposte le diverse classiartifactId
rappresenta il nome del progettodescription
è una descrizione del progetto (opzionale.
Si può inoltre notare il seguente spezzone:
<dependencies>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.2.220</version>
</dependency>
</dependencies>
Questo blocco è molto importante perché serve a gestire le diverse dipendenze del progetto Maven.
In questo caso viene gestita la dipendenza di H2
Questo blocchi racchiusi nei tag <dependency>
si chiamano anche starter e possono essere gestiti automaticamente dal gestore maven usato nel proprio IDE o manualmente, attingendo le informazioni dal sito https://mvnrepository.com/, nel nostro caso abbiamo attinto le info relative ad h2.
Un progetto maven è così organizzato:
/<artifactId>
-/src
--/main
---/java
----/<groupId>
-----Main.java
---/resources
--/test
---/java
-/target
--/classes
--/test-classes
-pom.xml
di seguito:
/<artifactId/src/main/java/<groupId>
contiene il l'entry point del progetto, quali ad esempioMain.java
il quale può essere tranquillamente essere rinominato. Gli altri package possono essere eventualmente disposte ad esempio in questo modo/<artifactId/src/main/java/<groupId>.<package>
/resources
è una cartella che contiene risorse varie ed eventuali, in questo progetto non c'è nessuna risorsa e può tranquillamente essere cancellata/test
è una cartella che contiene Unit Test e può tranquillamente essere cancellata/target
è la cartella dei file .class, è importante che ci sia almeno/target/classes
altrimenti Maven ha qualche problema ad essere validato.
Di conseguenza i file e le cartelle essenziali del progetto sono le seguenti:
/<artifactId>
-/src
--/main
---/java
----/<groupId>
-----Main.java
-/target
--/classes
-pom.xml