Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Basi di Dati SQL JAVA, Appunti di Elementi di Informatica

Dispense di Informatica. Basi di Dati, SQL, Java

Tipologia: Appunti

2012/2013

In vendita dal 30/09/2013

tanux87
tanux87 🇮🇹

11 documenti

1 / 8

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
SQL Application
In generale, per creare delle applicazioni che permettano ad un utente di interagire con la base dei
dati, si sceglie di programmare le applicazioni stesse, con i linguaggi di programmazione
tradizionali quali C,Java, creando in qualche modo un canale di comunicazione tra il linguaggio di
programmazione scelto e l’SQL.
Per mescolare l’SQL con un certo linguaggio di programmazione, si seguono due tecniche:
una basata su SQL-Embedded, cioè le istruzioni SQL sono direttamente incapsulate nel
linguaggio di programmazione scelto;
una basata su SQL/CLI, Call Level Interface, cioè vengono messe a disposizione del
programmatore che utilizza un certo linguaggio, specifiche librerie di funzioni.
Un problema comune ad entrambe, o meglio ancora un problema proprio della comunicazione tra
i diversi linguaggi di programmazione e l’SQL, è il cosiddetto conflitto di impedenza, causato dalla
differenza tra i tipi di dati e dal fatto che un linguaggio di programmazione opera su variabili,
mentre l’SQL su insiemi di tuple. Ed è per questo motivo che si preferiscono i linguaggi di
programmazione orientati agli oggetti, proprio perche gli oggetti astraggono i concetti precedenti.
SQL Embedded VS SQL/CLI
SQL Embedded: Le istruzioni SQL sono immerse nel programma, e un precompilatore legato al
DBMS viene usato per analizzare e tradurre il programma, in un programma scritto nel linguaggio
ospite, cioè quello che si è scelto per programmare. Se da un lato c’è il vantaggio che errori di
sintassi vengono segnalati a tempo di compilazione, il codice finale risulta difficile da manutenere.
SQL/CLI: Sono messe a disposizione del programmatore, delle librerie che permettono
l’interazione con il DBMS (connessione,interrogazioni,etc..). Non richiede l’uso di un
preprocessore, è possibile connettersi a diversi database anche su DBMS diversi, è possibile
connettersi anche a database remoti.
Architettura di una SQL Application
Si segue il principio generale di separazione dell’applicazione in 3 livelli logici, quali:
Dati
Business Logic (o Logica applicativa)
Interfaccia utente
Al di là delle diverse architetture a cui è possibile pensare, l’idea generale è che la logica
applicativa sia scritta in un certo linguaggio di programmazione e solo attraverso un sistema di
comunicazione si accede ai dati, ovviamente tramite l’SQL.
pf3
pf4
pf5
pf8

Anteprima parziale del testo

Scarica Basi di Dati SQL JAVA e più Appunti in PDF di Elementi di Informatica solo su Docsity!

SQL Application

In generale, per creare delle applicazioni che permettano ad un utente di interagire con la base dei dati, si sceglie di programmare le applicazioni stesse, con i linguaggi di programmazione tradizionali quali C,Java, creando in qualche modo un canale di comunicazione tra il linguaggio di programmazione scelto e l’SQL. Per mescolare l’SQL con un certo linguaggio di programmazione, si seguono due tecniche:

  • una basata su SQL-Embedded, cioè le istruzioni SQL sono direttamente incapsulate nel linguaggio di programmazione scelto;
  • una basata su SQL/CLI, Call Level Interface, cioè vengono messe a disposizione del programmatore che utilizza un certo linguaggio, specifiche librerie di funzioni. Un problema comune ad entrambe, o meglio ancora un problema proprio della comunicazione tra i diversi linguaggi di programmazione e l’SQL, è il cosiddetto conflitto di impedenza, causato dalla differenza tra i tipi di dati e dal fatto che un linguaggio di programmazione opera su variabili, mentre l’SQL su insiemi di tuple. Ed è per questo motivo che si preferiscono i linguaggi di programmazione orientati agli oggetti, proprio perche gli oggetti astraggono i concetti precedenti.

SQL Embedded VS SQL/CLI

SQL Embedded: Le istruzioni SQL sono immerse nel programma, e un precompilatore legato al DBMS viene usato per analizzare e tradurre il programma, in un programma scritto nel linguaggio ospite, cioè quello che si è scelto per programmare. Se da un lato c’è il vantaggio che errori di sintassi vengono segnalati a tempo di compilazione, il codice finale risulta difficile da manutenere. SQL/CLI: Sono messe a disposizione del programmatore, delle librerie che permettono l’interazione con il DBMS (connessione,interrogazioni,etc..). Non richiede l’uso di un preprocessore, è possibile connettersi a diversi database anche su DBMS diversi, è possibile connettersi anche a database remoti.

Architettura di una SQL Application

Si segue il principio generale di separazione dell’applicazione in 3 livelli logici, quali:

  • Dati
  • Business Logic (o Logica applicativa)
  • Interfaccia utente Al di là delle diverse architetture a cui è possibile pensare, l’idea generale è che la logica applicativa sia scritta in un certo linguaggio di programmazione e solo attraverso un sistema di comunicazione si accede ai dati, ovviamente tramite l’SQL.

Sistema di Comunicazione

Il già più volte citato sistema di comunicazione,è un insieme di API (Application Programming Intarface), cioè un insieme di funzioni richiamabili nel linguaggio di programmazione usato, che seguono lo standard CLI, e che permettono l’interazione coi i databases. L’evoluzione e la nascita di differenti DBMS, ha portato a creare dei driver specifici per ogni DBMS, modificando di conseguenza il ruolo del sistema di comunicazione, che di fatto diventa quello strato software che si interpone tra l’applicazione e i driver specifici del DBMS usato. Il vantaggio è dato dalla possibilità di interfacciarsi a qualsiasi database , ovviamente con il proprio driver specifico.

Le API più famose sono ODBC (by Microsoft) e JDBC (by Sun).

ODBC VS JDBC

Architettura di ODBC : Open Database Connectivity, è un’API che permette l’interazione tra i dati e l’applicazione, permettendo ai programmatori di formulare query SQL senza conoscere l’interfaccia proprietaria del dbms, traducendo proprio le query in un formato interpretabile dal dbms. Usa interfacce scritte in linguaggio C. E’ uno standard per l’accesso a database relazionali che offre un insieme di funzioni/procedure astratte invocabili da diversi linguaggi di programmazione.

Application : richiama le funzioni SQL per eseguire interrogazioni e per acquisirne i risultati. Garantisce una certa indipendenza rispetto alla scelta del protocollo di comunicazione, del server DBMS e del sistema operativo.

Driver Manager : è responsabile di caricare e gestire i driver del DBMS su richiesta dell’applicazione.

Driver : sono responsabili di eseguire funzioni ODBC. Sono in grado di eseguire interrogazioni in SQL traducendole in modo da adattarsi alla sintassi dello specifico DBMS.

Data Source : origine delle informazioni, è un nome che definisce un riferimento ad un database file o a un database gestito con DBMS, richiede che almeno venga specificato, quale driver ODBC di quale db/DBMS deve essere usato, dove si trova il database (e.g. in locale, o in rete per i DBMS). Nota: E’ per questo motivo che bisogna caricare il driver ODBC attraverso Risorse del Computer di Windows.

  1. Protocollo di rete: è un'implementazione di driver per database che fa uso di un middleware-server tra il programma chiamante e il database. Questo middleware-server converte le chiamate ai metodi JDBC nel protocollo specifico del database. Differisce dal driver Protocollo Nativo perché la logica della conversione risiede nel middleware-server, non nel client. Anche questo tipo è realizzato completamente in Java. Lo stesso driver può anche essere utilizzato per più database. Dipende dal numero di database che il middleware-server è configurato per supportare. Esso è indipendente dalla piattaforma, perché la gestione delle differenze tra le varie piattaforme è lasciata al middleware-server. Inoltre, l'utilizzo di un middleware-server offre vantaggi in termini di sicurezza.
  2. Protocollo Nativo : è un'implementazione di driver per database che converte le chiamate ai metodi JDBC nel protocollo nativo del database. Esso è scritto interamente in Java, perciò è indipendente dalla piattaforma. Fornisce prestazioni migliori rispetto ai tipi 1 e 2 perché non subisce il sovraccarico dovuto alle chiamate a ODBC o all'API nativa del database. Diversamente dai tipi 1 e 2, non ha bisogno che un certo software sia installato per poter funzionare. Siccome ogni protocollo nativo è diverso, vi sono driver differenti (di solito forniti dal produttore) per ogni tipo di database.

Interfacce e Classi del package SQL

Interfaccia Driver : rappresenta il punto di partenza per ottenere una connessione a un DBMS. Ogni produttore di driver JDBC implementa l’interfaccia Driver (mediante opportuna classe) affinché possa funzionare con un tipo particolare di DBMS.

Classe DriverManage r : è la classe che contiene tutti i driver di database registrati e permette di associarli ai database stessi. Tramite la suddetta classe è possibile registrare un nuovo driver, deregistrare uno esistente, etc. Nel momento in cui un oggetto Driver viene istanziato viene automaticamente registrato nella classe DriverManager come disponibile. Essa contiene il metodo getConnection(database) , che restituisce un oggetto di tipo Connection e apre il canale di comunicazione con il database.

Interfaccia Connection : un oggetto di tipo Connection rappresenta una connessione attiva a un database. L’interfaccia mette a disposizione dei metodi che permettono di “creare” degli oggetti (Statement e PreparedStatement )che serviranno poi, per inviare query SQL al DBMS. I metodi da citare sono:

  • Statement cretateStatement(), che ritorna un oggetto di tipo Statement, e quindi permette di istanziare un oggetto dello stesso tipo;
  • PreparedStatement prepareStatement(), che ritorna un oggetto di tipo PreparedStatement, e permette quindi di istanziare un oggetto dello stesso tipo;

Interfaccia ResultSet : un oggetto ResultSet è il risultato di una query di selezione (di fatto una tabella composta da righe e colonne). Esso è simile ad un iteratore, e i metodi da evidenziare sono:

  • boolean next() , avanza alla prossima riga del risultato; restituisce false se non c'è una prossima riga;
  • String getString(String nome_colonna ), legge un campo che contiene una stringa presente nella colonna data in input alla riga corrente, e ne restituisce il contenuto.
  • int getInt(String nome_colonna ), legge un campo che contiene un intero presente nella colonna data in input alla riga corrente, restituendone il contenuto.
  • String getString(int posizione_colonna) , legge la stringa presente nella colonna che ha la posizione data in input, alla riga corrente, restituendone il contenuto. La posizione parte da 1.
  • int getInt(String posizione_colonna) , legge l’intero presente nella colonna che ha la posizione data in input, alla riga corrente, restituendone il contenuto. La posizione parte da 1.

Al termine delle operazioni, l’oggetto di tipo ResultSet deve essere chiuso con il metodo close() , in quanto prende comunque delle risorse che devono essere rilasciate appena possibile.

Interfaccia Statement : un oggetto di tipo Statement viene utilizzato per inviare query SQL che non fanno uso di parametri. L'istruzione viene inviata al database di volta in volta.

Metodi importanti di Statement:

  • int executeUpdate(String sql) , un metodo che riceve in input la query sql da eseguire, che può essere solo una query di aggiornamento del database (quindi Insert,Delete,Update); restituisce il numero di righe inserite/cancellate/aggiornate.
  • ResultSet executeQuery(String sql ), la query in input può essere solo di selezione (quindi Select), e deve restituire un oggetto di tipo ResultSet (quindi una tabella composta dalle righe e dalle colonne selezionate).

Al termine delle operazioni, l’oggetto di tipo Statement deve essere chiuso con il metodo close() , in quanto prende comunque delle risorse che devono essere rilasciate appena possibile.

Interfaccia PreparedStatement : a differenza di Statement, l'istruzione viene compilata una sola volta, in modo che le chiamate successive siano più efficienti; inoltre, un oggetto di tipo PreparedStatement viene utilizzato per inviare query con parametri. I parametri presi in input, possono andare a comporre una query, che ricordiamo è formulata attraverso una stringa. Proprio per quest’ultimo motivo, può essere complicato gestire la stringa che potrebbe contenere dei parametri di input, con l’occorrenza di delimitatori e caratteri vari speciali. Per ovviare a questo inconveniente, si utilizza un oggetto di tipo PreparedStatement invece di Statement, che come abbiamo visto viene istanziato con il metodo prepareStatement(String sql) dell’interfaccia Connection; la stringa sql presa in input, se presenta parametri variabili, sono identificati con il punto interrogativo?. Il risultato sarà quindi una normale stringa senza la complicazione dei caratteri speciali. L’interfaccia PreparedStatement è estesa dall’interfaccia Statement, ereditandone tutte le funzionalità. In più sono presenti metodi per la gestione dei parametri.

Esempio di codice:

String database = "jdbc:odbc:traccia01"; String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; Connection connnessione; public ConnessioneDB(){ try { Class. forName (driver); //caricamento/registrazione del driver connessione = DriverManager. getConnection (database); //apertura della connessione } catch (ClassNotFoundException ex) { ex.printStackTrace(); } catch (SQLException ex) { ex.printStackTrace(); } }

public void esecuzioneQueryPrepared(String input) { try { String sql = "SELECT colonna FROM tabella WHERE campo=?;"; //sql con parametri PreparedStatement p = connessione.prepareStatement(sql);//creazione del commando con prepared statement p.setString(1, input); //settaggio dei parametri ResultSet rs = p.executeQuery(); //esecuzione della query rs.next(); //avanzamento alla prima riga della tabella ottenutta { //eventuali istruzioni per utilizzo del result set } rs.close(); p.close(); connessione.close(); } catch (SQLException e) { e.printStackTrace(); } }

public void esecuzioneQueryStatement() { try { String sql = "SELECT colonna FROM tabella;"; //query da eseguire Statement st = connessione.createStatement();//creazione dello statement ResultSet rs = p.executeQuery(sql); //esecuzione della query rs.next(); //avanzamento alla prima riga della tabella ottenutta { //eventuali istruzioni per utilizzo del result set } rs.close(); st.close(); connessione.close(); } catch (SQLException e) { e.printStackTrace(); } }

Gestione dei Metadati

  • JDBC permette l’accesso dinamico al database
  • Senza sapere nulla a priori è possibile conoscere la struttura interna del database
  • La classe ResultSetMetadata è la classe JDBC che consente l’acquisizione delle informazioni sulla struttura del Db (per esempio i nomi e il numero dei campi di una tabella)
  • Un oggetto della classe ResultSetMetadata viene creato a partire da un oggetto di tipo ResultSet (attraverso il metodo getMetadata())
  • Metodi di ResultSetMetadata
  • getColumnCount()
  • Numero dei campi dell’insieme risultante dal ResultSet
  • getColumnName(int i)
  • Nome dei campi dell’insieme risultante dal ResultSet