Accesso a Database con JDBC



Documenti analoghi
JDBC Driver Manager. JDBC Architettura generale. JDBC - Tipi di dato. JDBC - Flusso applicativo. JDBC - Tipi di dato. ODBC Driver. Livello di gestione

JDBC. A. Bechini Accesso a DataD con Java

JDBC versione base. Le classi/interfacce principali di JDBC

JDBC di base. Le classi/interfacce principali di JDBC

JDBC per l accesso Java a DB. Tito Flagella tito@link.it

Introduzione JDBC interfaccia java.sql driver caricare i driver

JDBC: Introduzione. Java Database Connectivity (JDBC): parte 1. Schema dei legami tra le classi principali. Principali classi/interfacce di JDBC

Non si deve fare ALCUN riferimento alla parte specifica di JDBC.

CORSO DI ALGORITMI E PROGRAMMAZIONE. JDBC Java DataBase Connectivity

Interfacce DBMS in breve

Esercitazione su JDBC

Java: la libreria delle classi

Lezione 9. Applicazioni tradizionali

Corso di Informatica Modulo T3 B2 - Database in rete

Accesso alle Basi di Dati

Scheda 15 Accedere ai DataBase con JDBC

Sviluppo di applicazioni per basi di dati

Come trattare il risultato di un comando SQL (relazioni) che

SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

PROVA FINALE Ingegneria del software

DBMS ed Applicazioni Motivazioni

Siti web centrati sui dati Architettura MVC-2: i JavaBeans

Programmazione Java Avanzata Spring - JDBC

Sviluppo Applicazioni Mobile Lezione 12 JDBC. Dr. Paolo Casoto, Ph.D

Basi di Dati Esercitazione JDBC. Giugno 2007

Laboratorio di reti II: Gestione di database lato server

Architettura MVC-2: i JavaBeans

Introduzione. 8- Programmazione di una base di dati attraverso JDBC ESEMPIO

Database e reti. Piero Gallo Pasquale Sirsi

Basi di Dati: Corso di laboratorio

JDBC: Java e database.

Caricamento della classe driver. Apertura della connessione. DriverManager.getConnection() Creazione di uno statement

Indice. Java. JDBC è l interfaccia di base standard di Java ai database relaionali

SQL e applicazioni. Capitolo 8. SQL e linguaggi di programmazione. Applicazioni ed SQL: architettura. Una difficoltà importante.

JDBC Un API JAVA per accedere a Basi di Dati Relazionali. Contenuti. Cos è JDBC? Introduzione a JDBC. Perché JDBC. Inside JDBC.

JDBC. Marco Tessarotto Programmazione dei Web Server Anno Accademico

Data Base. Master "Bio Info" Reti e Basi di Dati Lezione 6

Programmazione Java: JDBC

Tecnologie di Sviluppo per il Web

Al giorno d oggi, i sistemi per la gestione di database

Capitoli 8 e 9. SQL embedded. Applicazioni tradizionali Applicazioni Internet. Sistemi di basi di dati Raghu Ramakrishnan, Johannes Gehrke

User Tools: DataBase Manager

Motivazione. SQL e linguaggi di programmazione. Completezza computazionale. Completezza a livello di sistema. Accoppiamento (coupling)

Corso sul linguaggio SQL

Esercitazione 4 JDBC

Laboratorio di Basi di Dati e Web

JAVA JDBC. Andrea BEI

Informatica per le discipline umanistiche 2 lezione 10

Laboratorio di Sistemi Fondamenti di JDBC (parte1) Java. Fondamenti di JDBC

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

19. LA PROGRAMMAZIONE LATO SERVER

Dominio applicativo. Progettazione. v SQL incluso in codice applicativo v Embedded SQL v Cursori v Dynamic SQL v JDBC v Stored procedures

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Il linguaggio SQL. è di fatto lo standard tra i linguaggi per la gestione di data base relazionali.

2104 volume III Programmazione

Esercitazione sulle libpq - libreria C per PostgreSQL

Informatica Generale Andrea Corradini Sistemi di Gestione delle Basi di Dati

DBMS ED APPLICAZIONI (CAPITOLO 6) SQL incluso in codice applicativo Embedded SQL Cursori Dynamic SQL JDBC Stored procedures

Basi di dati. Il Linguaggio SQL. K. Donno - Il Linguaggio SQL

FileMaker 12. Guida ODBC e JDBC

Corso di Informatica (Programmazione) Lezione 6 (31 ottobre 2008)

Progetto di Basi di Dati e Multimidia Laboratorio Struttura dell applicazione web

Introduzione a Dev-C++

Esercitazione 8. Basi di dati e web

Informatica. Prof. A. Longheu. Introduzione a Java

Una metodologia di progettazione di applicazioni web centrate sui dati

Procedure memorizzate SQL-2003/PSM. Forma base di PSM. Parametri in PSM

MDAC. Attualmente la versione disponibile di MDAC è la 2.8 ma faremo riferimento alla 2.6. ADO Active Data Objects ADO OLE DB ODBC

Volumi di riferimento

Accesso Web a Data Base

Interfaccia JDBC. Sistemi Informativi L-A. Home Page del corso: Versione elettronica: JDBC.

Lezione V. Aula Multimediale - sabato 29/03/2008

Access. P a r t e p r i m a

Programmazione Java. Davide Di Ruscio Dipartimento di Informatica Università degli Studi dell Aquila.

JDBC. Paolo Atzeni. 11 marzo Progettazione di applicazioni, una premessa

Corso di Informatica. Prerequisiti. Modulo T3 B3 Programmazione lato server. Architettura client/server Conoscenze generali sui database

JDBC. Dispense per il corso di Ingegneria del Web

Java: Compilatore e Interprete

APPENDICE. Procedure in SQL (1)

Basi di dati e Web (Moduli: Laboratorio e Siti Web centrati sui Dati) Prova scritta del 14 luglio 2008

DBMS (Data Base Management System)

Laboratorio di Basi di Dati

COME CREARE E COLLEGARSI AD UN DATABASE MICROSOFT SQL SERVER O SUN MYSQL

Inizializzazione degli Host. BOOTP e DHCP

DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER

SQL. Laboratorio di Progettazione di Basi di Dati (CdS in Informatica e TPS)

Lezione 1 Introduzione

Il client deve stampare tutti gli eventuali errori che si possono verificare durante l esecuzione.

Riccardo Dutto, Paolo Garza Politecnico di Torino. Riccardo Dutto, Paolo Garza Politecnico di Torino

Cenni di programmazione distribuita in C++ Mauro Piccolo

L architettura di un DBMS

Dispensa di database Access

Strumenti per la programmazione

Transmission Control Protocol

Laboratorio Progettazione Web PHP e MySQL - Lezione 9. Andrea Marchetti IIT-CNR andrea.marchetti@iit.cnr.ita 2012/2013

Il problema. SQL da programma. Il problema - Esempio. Il problema. Estensioni imperative di SQL. Approcci

Caratteristiche principali. Contesti di utilizzo

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Introduzione alle applicazioni di rete

GESTIONE DEI PROCESSI

Transcript:

1 Sommario Accesso a Database con JDBC Introduzione architettura generale di riferimento flusso tipico delle applicazioni ODBC/JDBC ODBC architettura il flusso generale di un applicazione ODBC JDBC architettura tipologie di driver le classi principali il flusso generale di un applicazione JDBC 2 Architettura client/server Introduzione client applicazioni rete DBMS server Il SI è costituto da applicazioni che accedono a DB secondo il paradigma client/server il client e il server (DBMS) possono essere eseguiti su macchine diverse uno stesso server può servire più client un client può utilizzare più server Il problema principale nelle architetture client-server è l esistenza di client e server (DBMS) eterogenei: Front-end: gui, form, interfacce web Back-end: DBMS E necessario di stabilire come le applicazioni client possano comunicare con il server: come rappresentare le query come rappresentare i risultati delle query E opportuno rendere l accesso l ai dati indipendente dallo specifico server considerato se cambia il server non cambia l applicazione i tempi di sviluppo applicazioni client si riducono 3 4 Introduzione Architettura di riferimento Accesso indipendente dal server rappresenta il problema principale nello sviluppo di applicazioni eterogenee per sistemi distribuiti richiede funzionalità di adattabilità e di conversione che permettano lo scambio di informazione tra sistemi, reti ed applicazioni, anche se eterogenei Per i sistemi di gestione dei dati esistono standard sviluppati in forma di API (Application Program Interface) ODBC JDBC API API 5 6

7 Flusso tipico delle applicazioni su basi di dati Applicazione su DB è un programma che chiama specifiche funzioni API per accedere ai dati gestiti da un DBMS Flusso tipico: 1. connessione alla sorgente dati (DBMS e specifico database) 2. sottomissione di statement SQL per l esecuzione 3. recupero dei risultati e processamento degli errori 4. commit o rollback della transazione che include lo statement SQL 5. disconnessione Driver Manager È una libreria che gestisce la comunicazione tra applicazione e driver risolve problematiche comuni a tutte le applicazioni decide quale driver caricare, sulla base delle informazioni fornite dall applicazione caricamento del driver chiamate alle funzioni dei driver l applicazione interagisce solo con il driver manager 8 Driver DBMS 9 Sono librerie dinamicamente connesse alle applicazioni che implementano le funzioni API ciascuna libreria è specifica per un particolare DBMS Mascherano le differenze di interazione dovute ai DBMS, sistema operativo e protocollo di rete usati Traducono le varie funzioni API nel dialetto SQL usato dal DBMS (o nell API supportata dal DBMS) Si occupano in particolare di: iniziare transazioni sottomettere statement SQL inviare e recuperare dati gestire errori 10 Il DBMS sostanzialmente rimane inalterato nel suo funzionamento riceve sempre e solo richieste nel linguaggio che supporta esegue lo statement SQL ricevuto dal driver e invia i risultati ODBC (Open DataBase Connectivity) Standard proposto da Microsoft nel 1991 Supportato da praticamente tutti i DBMS relazionali Offre all applicazione applicazione un interfaccia che consente l accesso ad un DB indipendente da: il particolare dialetto di SQL il protocollo di comunicazione da usare con il DBMS la posizione del DBMS (locale o remoto) è possibile connettersi ad un particolare DB tramite un DSN (Data Source Name), che contiene tutti i parametri necessari alla connessione con il DB: protocollo di comunicazione tipo di sorgente dati (es: Oracle DBMS) specifico database ODBC L architettura è conforme allo schema generale Le funzioni sono implementate in C e quindi non sono completamente portabili Il linguaggio supportato da ODBC è un SQL ristretto, costituito da un insieme minimale di istruzioni scelta obbligata se si vuole permettere un cambio di DBMS lasciando inalterati i client Il linguaggio supporta sia query statiche (per applicazioni tradizionali) sia query dinamiche (per applicazioni interattive) nel primo caso eventuali errori di SQL sono riportati al momento stesso della compilazione 11 12

13 ODBC: Architettura Funzionamento di query ODBC Driver Manager: fornito con i sistemi operativi Windows deve essere installato con Linux Driver: forniti con il DBMS corrispondente spesso installati e registrati a livello Driver Manager quando si installa il DBMS client 14 Come registrare un DSN? Data Source Name (DSN) è una stringa che indica: tipo di driver tipo di comunicazione tipo di database nome del DBMS e del database Tool di amministrazione dei driver ODBC permettono di specificare tutti i dettagli di una sorgente dati DSN dopo la registrazione, queste informazioni sono a disposizione del Driver Manager Uso di una base di dati Access via ODBC 1. clickare Start Impostazioni Pannello di Controllo Strumenti di Amministrazione Origine Dati DSN System 2. premere Aggiungi 15 16 Uso di una base di dati Access via ODBC 3. Selezionare Microsoft Access Driver e premere Finish 4. Scrivere un nome in Data Source Name e premere Select Uso di una base di dati Access via ODBC 5. Selezionare Northwind.mdb nella directory MSOffice\Samples Samples e premere OK 6. premere OK nelle due finestre seguenti 17 18

19 JDBC Limitazioni nell uso di ODBC: ODBC è un API sviluppata in C che richiede API intermedie per essere usata con altri linguaggi Interfaccia di non agevole interpretazione: alcuni concetti sono portati a livello interfaccia ma sarebbe meglio mantenerli nascosti JDBC è stato sviluppato nel 1996 dalla Sun per superare questi problemi non è un acronimo ma un trademark della SUN JDBC Rappresenta una API standard per interagire con basi di dati da applicazioni Java Permette di ottenere una soluzione pure Java per l interazione l con DBMS indipendenza dalla piattaforma inclusa in JDK Interfaccia chiara e, nel contempo, flessibile 20 JDBC: Architettura generale Java Applications JDBC API JDBC Driver Manager JDBC Driver API JDBC Driver API Tipi di driver Esistono quattro tipi di driver: JDBC-ODBC Bridge + ODBC Driver native-api partly Java technology-enabled driver Pure Java Driver for Database Middleware Direct-to-Database Pure Java Driver DBMS DBMS 21 22 Tipi di driver Driver di tipo 1 Accesso a JDBC tramite un driver ODBC uso di JDBC-ODBC bridge il codice ODBC binario e il codice del DBMS client, deve essere caricato su ogni macchina client che usa JDBC-ODBC bridge JDBC-ODBC Bridge plus ODBC Driver A native-api partly Java technology-enabled driver Direct-to-Database Pure Java Driver Pure Java Driver for Database Middleware si consiglia di utilizzare questa strategia quando non esistono soluzioni alternative è necessario installare le librerie sul client perché non sono trasportabili su HTTP compromette write once, run anywhere 23 1 2 4 3 24

25 Driver di tipo 2 Le chiamate a JDBC vengono tradotte in chiamate all API del DBMS prescelto es. OCI Oracle Il driver contiene codice Java che chiama metodi scritti in C/C++ non utilizzabile per applet/servlet anche in questo caso, codice binario deve essere caricato sul client compromette write once, run anywhere Driver di tipo 3 Basato completamente su Java utilizzabile con applet/servlet converte le chiamate JDBC nel protocollo di una applicazione middleware che traduce quindi la richiesta del client nel protocollo proprietario del DBMS l applicazione middleware può garantire l accesso a diversi DBMS il protocollo middleware dipende dal DBSM sottostante 26 Driver di tipo 4 Tipi di dato 27 Basato completamente su Java utilizzabile con applet/servlet converte le chiamate JDBC nel protocollo di rete usato direttamente dal DBMS permette quindi un accesso diretto dalla macchina client alla macchina server è la soluzione più pura in termini Java 28 ODBC/JDBC usano tipi SQL, mappati in tipi Java Gli identificatori sono definiti nella classe java.sql.types JDBC Types Mapped to Java Types JDBC Type CHAR VARCHAR LONGVARCHAR NUMERIC DECIMAL BIT TINYINT SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE BINARY VARBINARY LONGVARBINARY DATE TIME TIMESTAMP Java Type String String String java.math.bigdecimal java.math.bigdecimal boolean byte short int long float double double byte[] byte[] byte[] java.sql.date java.sql.time java.sql.timestamp Interfaccia JDBC (semplificata - solo le classi che vedremo) Passo 1: caricamento driver classe interfacce DriverManager Driver Connection Statement ResultSet Java.sql.* Il driver manager mantiene una lista di classi che implementano l interfaccia l java.sql.driver l implementazione del Driver deve essere registrata in qualche modo nel DriverManager Quando una classe Driver viene caricata, se ne crea un istanza e ne viene effettuata anche la registrazione Due modi: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver ); DriverManager.registerDriver(new sun.jdbc.odbc.jdbcodbcdriver()); Il nome della classe da usare viene fornito con la documentazione relativa al driver 29 30

31 Passo 2: Connessione Passo 2: Connessione Per realizzare la connessione vengono utilizzate le seguenti classi ed interfacce: classe java.sql.drivermanager: gestisce la registrazione dei driver interfaccia java.sql.driver: non viene esplicitamente utilizzata a livello applicativo interfaccia java.sql.connection: permette di inviare una serie di richieste SQL al DBMS È possibile connettersi a qualunque database, locale e remoto, specificandone l URL l URL ha tre parti: jdbc: : <subprotocol< subprotocol>: <subname< subname> <subprotocol> identifica il driver o il meccanismo di connessione al database <subname> dipende da subprotocol ed identifica lo specifico database 32 Esempi: jdbc:oracle:thin:@everest:1521:gen: subprotocol: Oracle subname: Thin: specifica che si deve essere utilizzare Oracle ODBC Thin driver Everest: specifica il nome della macchina 1521: numero porta GEN: nome database Oracle jdbc:mysql://cannings.org:3306/test subprotocol: MySQL subname: cannings.org specifica il nome della macchina 3306 : numero porta test : nome database MySQL se si usa JDBC-ODBC driver: jdbc:odbc:subname Passo 2: Connessione La connessione avviene chiamando il metodo getconnection della classe DriverManager, che restituisce un oggetto di tipo Connection Connection con = DriverManager.getConnection( jdbc:odbc:miodatabase, mylogin", "mypassword"); Se uno dei driver caricati riconosce l URL fornito dal metodo, il driver stabilisce la connessione Passo 3: Creazione ed esecuzione degli statement Per creare ed eseguire uno statement vengono utilizzate le seguenti classi: java.sql.connection: per creare lo statement java.sql.statement: permette di eseguire gli statement java.sql.resultset: per analizzare i risultati delle query un oggetto di tipo Statement viene creato a partire da un oggetto di tipo Connection e permette di inviare comandi SQL al DBMS : Connection con; Statement stmt = con.createstatement(); 33 34 Esecuzione di statement Prepared Statement 35 Distinzione tra statement di interrogazione e statement di aggiornamento (come in ODBC) per eseguire query: stmt.executequery( SELECT * FROM IMPIEGATI"); per eseguire operazioni di aggiornamento (inclusi gli statement DDL) stmt.executeupdate( INSERT INTO IMPIEGATI VALUES AB34, Gianni, Rossi, GT67,1500"); stmt.executeupdate("create TABLE ) ); Il terminatore dello statement (es. ; ) è inserito dal driver prima di inviare lo statement al DBMS per l esecuzione 36 E possibile preparare gli statement prima dell esecuzione esecuzione (come in ODBC) statement precompilati L uso di prepared statement riduce i tempi di esecuzione dell operazione sono usati per statement utilizzati molte volte PreparedStatement queryimp = con.preparestatement( SELECT * FROM IMPIEGATI"); queryimp.executequery(); queryimp.executequery();

37 Prepared Statement: uso di parametri La stringa SQL può contenere parametri identificati da? (eventualmente letti da input) Metodi setxxx (dove XXX è il tipo Java del parametro) consentono di completare gli statement SQL con i valori dei parametri PreparedStatement queryimp = con.preparestatement("select * FROM IMPIEGATI WHERE Nome =?"); queryimp.setstring(1, Rossi ); queryimp.executequery(): Passo 4: Elaborazione risultato JDBC restituisce i risultati di esecuzione di una query in un result set (come ODBC) String query = " SELECT * FROM IMPIEGATI "; ResultSet rs = stmt.executequery(query); Il result set è costruito solo per query e non per INSERT, DELETE, UPDATE (come in ODBC) in questo caso viene restituito un intero, che rappresenta il numero di tuple modificate 38 Metodi per accedere alle tuple del risultato: next Il metodo next permette di iterare su un result set: inizialmente il cursore è posizionato prima della prima tupla il metodo diventa false quando non ci sono più tuple iterazione tipica: while (rs.next()) { /* elabora la tupla corrente */ Esempio: while (rs.next()) { String s = rs.getstring( Cognome"); float n = rs.getfloat( Stipendio"); System.out.println(s + " " + n); Metodi per accedere agli attributi: getxxx Permette di recuperare il valore associato ad un attributo della tupla puntata dal cursore XXX è il tipo Java in cui si deve convertire il valore getint per valori numerici getstring per char, varchar Esempio: String s = rs.getstring( Cognome"); Gli attributi possono anche essere acceduti tramite la notazione posizionale String s = rs.getstring(2); int n = rs.getint(5); 39 40 Esempio Esempio esecuzione diretta 41 Nel seguito gli esempi si riferiranno alla tabella Impiegati definita in SQL come segue: CREATE TABLE Impiegati (Matr VARCHAR(4), Nome VARCHAR(20), Cognome VARCHAR(20), Manager VARCHAR(4), Stipendio NUMBER); 42 import java.sql.*; import java.io.*; class JdbcTest { public static void main (String args []) { Class.forName ( sun.jdbc.jdbcodbcdriver"); Connection con= DriverManager.getConnection( jdbc:odbc:dbimpiegati, "", ""); Statement st = con.createstatement (); String stmt = "SELECT * FROM Impiegati WHERE Cognome = Rossi "; ResultSet improssi = st.executequery (stmt); while ( improssi.next() ) System.out.println( improssi.getstring( Stipendio"));

43 Esempio prepared statement import java.sql.*; import java.io.*; class JdbcTest { public static void main (String args []) { Class.forName ("oracle.jdbc.oracledriver"); Connection con = DriverManager.getConnection( jdbc:odbc:dbimpiegati,"", ""); String stmt ="SELECT * FROM Impiegati WHERE Cognome = Rossi "; PreparedStatement prepst = con.preparestatement (stmt); ResultSet improssi = prepst.executequery (); while ( improssi.next() ) System.out.println ( improssi.getstring ( Stipendio")); 44 Passo 6: Disconnessione (chiusura) Il metodo close() permette di risparmiare risorse: rilascio degli oggetti di classe Connection, Statement, ResultSet non più utilizzati la chiusura di un oggetto di tipo Connection chiude tutti gli Statement associati la chiusura di uno Statement chiude ResultSet associati Eccezioni: classe java.sql.sqlexception Esempio 45 Estende la classe java.lang.exception Fornisce informazioni ulteriori in caso di errore di accesso al database la stringa SQLState che rappresenta la codifica dell errore in base allo standard X/Open getsqlstate() il codice di errore specifico al DBMS geterrorcode() una descrizione dell errore getmessage() 46 import java.sql.*; import java.io.*; class JdbcTest { static String ARS_URL = "; public static void main (String args []) { try{ Class.forName ( "); Connection ARS; ARS =DriverManager.getConnection(ARS_URL, ", "); catch (SQLException e) { while( e!=null){ System.out.println( SQLState: + e.getsqlstate()); System.out.println( Code: + e.geterrorcode()); System.out.println( Message: + e.getmessage()); e = e.getnextexception(); Warning: la classe java.sql.sqlwarning Esempio 47 Sottoclasse di SQLException Fornisce informazioni su warning innescati dall accesso accesso al DB Non bloccano l esecuzione del programma I warning vengono collegati agli oggetti i cui metodi hanno generato l eccezionel connection statement resultset Sono recuperabili con i metodo getwarnings() 48 Statement selimp = con.createstatement (); String stmt = "SELECT * FROM Impiegati WHERE Cognome = Rossi "; ResultSet improssi = selimp.executequery (stmt); while ( improssi.next() ) { System.out.println (improssi.getstring ( Stipendio")); SQLWarning warning_stmt = selimp.getwarnings(); while (warning_stmt!= null) { System.out.println( Message: + warning_stmt.getmessage()); System.out.println( SQLState: + warning_stmt.getsqlstate()); System.out.println( Vendor error code: + warning_stmt.geterrorcode()); warning_stmt = warning_stmt.getnextwarning();