Interrogazioni di basi di dati da programmi Java
Una base di dati (database) è una collezione di dati organizzata in modo da poter essere facilmente consultata e aggiornata.
In un database relazionale i dati sono organizzati in tabelle, strutturati in colonne (che rappresentano attributi della tabella) e in righe (che rappresentano le istanze dei dati memorizzate nella tabella).
I database sono gestiti da un sistema software che prende il nome di DataBase Management System (DBMS).
Le applicazioni possono accedere ai dati attraverso i servizi del DBMS.
Un DBMS disaccoppia le applicazioni e i dati, in modo che i programmatori applicativi non debbano preoccuparsi dei dettagli della organizzazione, archiviazione e gestione dei dati.
SQL (Structured Query Language) è il linguaggio usato nei sistemi di gestione di basi di dati per:
Java offre la possibilità di interagire con un database attraverso il suo DBMS, inviando interrogazioni in SQL e ricevendone l’esito.
Le comunicazioni tra un applicativo Java e un DBMS sono mediate attraverso un driver chiamato “Java Database Connectivity” (JDBC) e una libreria di classi chiamata java.sql.
Per poter utilizzare JDBC bisogna aver installato un DBMS e il relativo driver JDBC.
Java offre la classe DriverManager per la gestione dei driver installati. Essa non fornisce un costruttore, ma è una collezione di metodi statici:
jdbc:subprotocol:subname
Il metodo getConnection(...)
restituisce un oggetto Connection che implementa l’interfaccia con i metodi per interagire con il database. I principali metodi sono:
createStatement()
: crea un oggetto di tipo Statement, che definisce i seguenti metodi:
executeQuery()
esegue un’interrogazione SQL di query (DQL), e ritorna un oggetto di tipo ResultSet con il contenuto dell’operazione;execute()
esegue un’interrogazione SQL e restituisce un valore true se un oggetto ResultSet è stato creato;executeUpdate()
esegue un’istruzione di aggiornamento, cioè di tipo DML, e restituisce il numero di righe aggiornate o 0 se l’operazione non restituisce alcun risultato.close()
: chiude la connessione.I risultati di una query su un database sono restituiti come una tabella di dati organizzati per riga e per colonna, come oggetto della classe ResultSet
, che supporta metodi per l’accesso tabellare ai dati.
Un oggetto ResultSet mantiene un puntatore, o cursore, a una riga dei dati tabellari. All’inizio il cursore punta alla riga precedente alla prima riga della tabella. Il metodo next() serve a far scorrere il cursore, che restituisce true se il cursore si è spostato, o false se si è arrivati all’ultima riga.
Per accedere alle singole colonne della riga puntata dal cursore, la classe ResultSet mette a disposizione un insieme di metodi get(). Inoltre ResultSet ha associato un oggetto di tipo ResultSetMetaData, con meta informazioni sullo schema dei dati restituiti.
Definizione dei parametri di connessione con il database:
String dbUrl = "jdbc:odbc:people";
String user = ""; String password = "";
Carico il driver per la connessione con il DBMS: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Instauro la connessione con il database: Connection c = DriverManager.getConnection(dbUrl, user, password);
Creo uno Statement SQL e la stringa interrogazione:
Statement s = c.createStatement();
String queryString = "SELECT Nome, Cognome, Email " +
"FROM Studenti " +
"WHERE (Matricola='" + args[0] + "') ";
Eseguo l'interrogazione e verifico se è ritornato un risultato, in caso affermativo processo il risultato:
boolean hasResults = s.execute(queryString);
if(hasResults)
Ottengo un oggetto ResultSet
, scorro la tabella contenuta nell'oggetto riga per riga con next()
e accedo alla colonna della riga corrente copn getString()
passando come parametro il nome della colonna da accedere:
ResultSet r = s.getResultSet();
while(r.next()) {
System.out.println(r.getString("Nome") + ", "
+ r.getString("Cognome") + ": " + r.getString("Email") );
Chiudo lo statement, che chiuderà automaticamente anche l'oggetto ResultSet, e rilascio la connessione con il Database:
s.close();
c.close();
La connessione ai database per mezzo di driver JDBC adotta un approccio diverso all’Embedded SQL (SQLJ): le istruzioni in Java e le interrogazioni SQL non si sovrappongono, ma esiste una netta separazione.
In JDBC, non esiste un preprocessore che verifica la validità sintattica e semantica delle istruzioni SQL, ma le stringhe di interrogazione sono inviate direttamente al DBMS che le interpreta.
JDBC Mostra codice
SQLJ Mostra codice
La connessione ai database tramite JDBC è diversa dall’uso di middleware ad accesso remoto dei dati (RDA).
JDBC implementa un accesso diretto al DBMS, mentre i middleware RDA presentano uno strato aggiuntivo.
Pertanto JDBC non introduce il sovraccarico che invece caratterizza soluzioni RDA.
Tuttavia lo strato middleware delle soluzioni RDA presenta molti vantaggi che JDBC non ha:
2. La modellazione a oggetti e il linguaggio UML (richiami)
3. Generalità su Java e la programmazione ad oggetti
6. Regole di traduzione da UML a Java/C++
7. Programmazione multi-thread
8. Sincronizzazione tra thread
9. Programmazione client-server con socket TCP/IP (Java networkin...
10. Programmazione di applicazioni client-server: il Pattern Proxy...
12. Design Patterns
13. Pattern architetturali - Esempi
14. Design pattern creazionali. Esempi
15. Design pattern strutturali. Esempi
16. Introduzione alle tecnologie middleware
17. Modelli di middleware: RPC, MOM, TP, TS
Bruce Eckel, “Thinking in Java”