Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D La Corte in Rete
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Stefano Russo » 11.Accesso a database


Sommario

Interrogazioni di basi di dati da programmi Java

Basi di dati

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).


DBMS

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

SQL (Structured Query Language) è il linguaggio usato nei sistemi di gestione di basi di dati per:

  • creare, modificare ed eliminare tabelle (Data Definition Language[DDL]); es. di istruzione DDL:
    • CREATE TABLE Studenti(Cognome char(30), Nome char(20));
  • inserire, modificare, cancellare dati nelle tabelle (Data Maintenance Language[DML]); es. di istr. DML:
    • INSERT INTO Studenti VALUE ( ‘Bianchi’, ‘Mario’, …);
  • interrogare una base di dati (Data Query Language[DQL]); es. di istruzione DQL:
    • SELECT * FROM Studenti WHERE Cognome = ‘Bianchi’.

JDBC

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.


La classe DriverManager

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:

  • getDrivers() restituisce una lista di tutti i driver installati nel sistema;
  • getConnection(…) instaura una connessione con un database. Come parametro di ingresso prende l’URL di connessione, e in aggiunta due String che rappresentano l’username e la password per la connessione. Le URL di connessione a un database dipendono dallo specifico DBMS in uso, ma si presentano sempre nella forma:

jdbc:subprotocol:subname

La classe DriverManager

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.

La classe ResultSet

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.

Esempio

Mostra codice

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)

Esempio

Mostra codice

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();

JDBC vs SQLJ

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

JDBC vs middleware RDA

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:

  • le interrogazioni SQL sono sempre inviate al DBMS, mentre in RDA sono inviate in locale allo strato middleware, che svolge anche controlli sintattici, evitando di inoltrare al DBMS richieste invalide;
  • JDBC trasferisce tutti i dati risultanti da un’interrogazione, e l’applicativo deve essere in attesa che quest’operazione di trasferimento si completi. Soluzioni di tipo RDA adottano dei trasferimenti ottimizzati in grado di ridurre i tempi di attesa.

I materiali di supporto della lezione

Bruce Eckel, “Thinking in Java”

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion

Fatal error: Call to undefined function federicaDebug() in /usr/local/apache/htdocs/html/footer.php on line 93