Ciao a tutti,
qualche tempo avevamo visto come installare MongoDB su windows e su linux. Oggi vediamo come usare questa tecnologia con Java. Per utilizzare MongoDB con un certo linguaggio di programmazione servono i cosidetti driver ovvero delle librerie che mettono a disposizione dei metodi per interazioni sia sincrone che asincrone con MongoDB.
In questo articolo non starò tanto a tediarvi con dettagli sulla sintassi. Ho tirato sù un progettino esplicativo che illustra le principali operazioni che si possono fare in un database.
Il codice è consultabile a questo indirizzo e vi consiglio ti tenerlo aperto in un'altra scheda mentre leggete questo articolo (non voglio riscrivere codice anche qua dentro).
Per aggiungere qualche dettaglio generale, ho creato una classe Person che al suo interno ha gli attributi id (identificativo univoco), nome, cognome, età, una lista di hobby e una lista di contatti. I contatti a loro volta sono istanze di una classe Contact composta da un campo descrizione ed un valore (es. descrizione="tel", valore="333445566"). Vedremo quindi le classiche operazioni CRUD ovvero Create, Read, Update e Delete e altre cosette che possono sempre essere utili sulla classe Person.
Richiamo su MongoDB
Per evitare incomprensioni ricordiamo alcuni aspetti fondamentali di MongoDB:
- MongoDB è un DBMS NON relazionale. Quindi scordiamoci i vincoli di integrità referenziale è tutte quelle "belle" cose che ne derivano.
- MongoDB è organizzato in collezioni di documenti: quello che nei DBMS relazionali chiamavamo tabelle, qua sono collezioni mentre i record sono documenti. C'è una differnza sostanziale! Una collezione di per sé è un insieme di oggetti JSON ovvero di documenti. Ogni documento non è vincolato ad un modello prestabilito! Quindi se Person ha due documenti (due persone), all'interno di questi due documenti ci possono essere attributi completamente diversi: in uno ci può essere il codice fiscale mentre nell'altro la lista dei cibi preferiti:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
>db.Person.find().pretty() { "_id" : ObjectId("877haeea1g6a5e1kfq6932n7"), "name": "Andrea", "age": 30, "CF": "ABCABC99A01A123B" }, { "_id" : ObjectId("590fabea3b2a5e2bfb4286e6"), "name": "Francesco", "age": 25, "cibi": [ "Pizza", "Sushi", "Tiramisù" ] } |
In questo esempio vediamo due documenti validi della collezione Person. Quindi i vari controlli sulla presenza di attributi e dei loro valori, è demandata alla logica del programma che fa le operaizoni sul DB.
Il progetto
Quando lavoriamo con un database è sempre buona cosa dividere la logica che interagisce a stretto contatto con il database, con il resto. È per questo che ho creato una classe DAO (Data Access Object) che si occupa di gestire la connessione con MongoDB e fare le operazioni che gli richiediamo. La classe l'ho struttura con il design pattern Singleton, quindi quando vogliamo fare una query al DB basterà ottenere l'istanza dell'oggetto DAO e procedere chiamando il metodo che fa l'operazione voluta.
Nel progetto quindi abbiamo tre pacchetti:
- dao: dove vengono getsite le operazioni nel DB
- main: dove c'è la logica per testrare il funzionamento del dao e i modelli
- utility: dove ci sono una classe che contiene i parametri per il DB (Parameters) e una classe con dei metodi per convertire gli oggetti con cui lavora il Java Driver in oggetti Person/Contact e viceversa.
Configurazione di un progetto
Per poter utilizzare i MongoDB Java driver bisogna scaricare a questo indirizzo il driver e il driver-core. In più va aggiunto anche bson scaricabile da qui. Nel progetto di eclipse dovremo quindi aggiungere questi jar nel Java Build Path.
Nel nostro progetto potete trovare questi file nella cartella lib.
DAO
In questa classe vediamo che ricorrono alcuni tipi che mette a disposizone il driver Java:
- DBCollection che rappresenta la collezione
- BasicDBObject che sono degli oggetti composti da coppie chiave-valore e possono essere utilizzati sia per rappresentare un oggetto da inserire nel DB (come ad es in createPerson) che per rappresentare una condizione di ricerca (come ad es searchQuery nel metodo updatePerson).
- DBCursor è l'oggetto che contiene i risultati di una query sul quale dovremo iterare.
I vari metodi sono piuttosto semplici e intuitivi e il codice è commentato. L'unica cosa forse su cui spendere una parola in più, è il metodo getPersonsWithTheseAges. Notiamo che in questo metodo vengono usate più clausole utilizzando la disgiunzione logica. Per fare questo è necessario costruire un oggetto BasicDBList di BasicDBObject (che rappresentano le singole clausole) per poi creare un DBObject nel quele indichiamo che sulla lista di clausole c'è da farci l'operaizone di OR (per le altre operazioni rimando alla documentazione).
Converter
In questa classe è interesssante vedere come vengono convertiti gli oggetti del modello in oggetti BaicDBObject e BasicDBList nella fattispecie come nel metodo convertBasicDBObject2Person vengono gestiti diversamente le due ArrayList una di String e l'altra di oggetti.
Main
Nel main vediamo alcune delle operazioni per verificare il corretto funzionamento dei metodi del DAO. Inizialmente richiediamo l'istanza del DAO, droppiamo la collezione Person per fare pulito, popoliamo il DB con tre identità e poi le stampiamo a console con una richiesta getAllRows.
In seguito per testare il metodo di update chiediamo all'utente di inserire l'id della Person a cui modificare l'età a 30 anni. Infine testiamo il metodo getPersonsWithTheseAges passandogli la lista con le età 18 e 28.
Considerazioni e conclusioni
Questo progetto pur avendo diverse cosette al suo interno per interagire con MongoDB in Java, può essere esteso e migliorato. Ad esempio mancano controlli sui dati, eccezioni e quant'altro che ho volutamente tralasciato per evitare di appesantire troppo la lettura del codice (KISS rulez).
Per ulteriori dettagli invito a consultare il sito di MongoDB
Se c'è qualcosa che non vi torna o volete altri esempi a riguardo non esitate a scrivere un commento qua sotto!
Buona programmazione!