19/05/2003 Tecnologie di Sviluppo per il Web Programmazione su Basi di Dati: JDBC Concetti Fondamentali versione 1.0 G. Mecca – [email protected] – Università della Basilicata JDBC >> Sommario Concetti Fondamentali m Introduzione ðArchitettura ðTipi di driver m Un Esempio ðDriver e Driver Manager ðConnection e URI ðStatement e Result Set G. Mecca - Tecnologie di Sviluppo per il Web 2 1 19/05/2003 JDBC >> Concetti Fondamentali >> Introduzione Introduzione m JDBC ðnon è l’acronimo di Java DataBase Connectivity ðesempio di CLI orientata agli oggetti ðAPI standard di Java 2 SDK ðarrivata alla versione 3.0 (in J2SDK 1.4.0) m Package ðjava.sql: classi fondamentali ðjavax.sql: estensioni 3 G. Mecca - Tecnologie di Sviluppo per il Web JDBC >> Concetti Fondamentali >> Introduzione Architettura utilizza le interfacce java.sql e javax.sql Applicazione Java Driver Manager Driver Driver Driver PgSQL Oracle File System implementano java.sql e, in alcuni casi javax.sql Conformità: almeno SQL-92 Entry Level G. Mecca - Tecnologie di Sviluppo per il Web 4 2 19/05/2003 JDBC >> Concetti Fondamentali >> Introduzione Tipi di Driver m Tipo 1 ðPonte JDBC-ODBC (“JDBC-ODBC Bridge”) m Tipo 2 ðParte Java, Parte API Nativa m Tipo 3 ðDriver di Rete Tutto in Java m Tipo 4 ðDriver Nativo Tutto in Java 5 G. Mecca - Tecnologie di Sviluppo per il Web JDBC >> Concetti Fondamentali >> Introduzione Driver di Tipo 1 Client Applicazione Driver JDBC Tipo 1 m Ponte JDBC-ODBC ðusa un driver ODBC ðtraduce da JDBC in chiamate ODBC ðnormalmente usa una libreria del DBMS ðprestazioni scadenti ðnon indipendente dalla piattaforma G. Mecca - Tecnologie di Sviluppo per il Web Driver ODBC Libreria del DBMS Rete Server DBMS 6 3 19/05/2003 JDBC >> Concetti Fondamentali >> Introduzione Driver di Tipo 2 Client Applicazione m Parte Java, Parte API Nativa ðsfrutta una libreria del DBMS ðtraduce le chiamate in chiamate alla libreria ðmigliori prestazioni ðnon indipendente dalla piattaforma Driver JDBC Tipo 2 Libreria del DBMS Rete Server DBMS 7 G. Mecca - Tecnologie di Sviluppo per il Web JDBC >> Concetti Fondamentali >> Introduzione Driver di Tipo 3 Client Applicazione Driver JDBC Tipo 3 m Driver di Rete Tutto Java ðsfrutta un server intermedio ðdriver JDBC leggero ðclient indipendente dalla piattaforma ðservizi avanzati (caching) ðarchitettura complessa ðtempi di trasferimento G. Mecca - Tecnologie di Sviluppo per il Web Rete Middleware Server Strato intermedio Rete Server DBMS 8 4 19/05/2003 JDBC >> Concetti Fondamentali >> Introduzione Driver di Tipo 4 Client m Driver Nativo Tutto in Java ðil driver comunica direttamente con il DBMS ðindipendente dalla piattaforma ðbuone prestazioni ðscaricabile dinamicamente G. Mecca - Tecnologie di Sviluppo per il Web Applicazione Driver JDBC Tipo 4 Rete Server DBMS 9 JDBC >> Concetti Fondamentali >> Introduzione Tipi di Driver Tipo 1 fornito a corredo di J2SDK m Migliori prestazioni e flessibilità:Tipo 3 o 4 m Tipo 3 m ðapplicazioni di fascia alta ðservizi avanzati m Tipo 4 ðmaggiore semplicità ðarchitettura semplificata G. Mecca - Tecnologie di Sviluppo per il Web 10 5 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Un Esempio m Il Sistema Informativo dell’ACI ðdati su automobili e proprietari m Operazioni ðinserimento dei dati di un proprietario ðricerca dei proprietari per nome e c.f. ðinserimento dei dati di un’automobile ðelenco dei proprietari e delle automobili ð... 11 G. Mecca - Tecnologie di Sviluppo per il Web JDBC >> Concetti Fondamentali >> Un Esempio Un Esempio Obiettivo: esemplificare l’API JDBC m Per semplicità m ðarchitettura semplificata (architettura di base) ðinterfaccia basata su console m Funzionamento ðl’utente si identifica con nome utente e password ða seconda del suo ruolo (utente o amministratore) accede ad un menu che gli consente di effettuare varie operazioni >> il s.i. dell’ACI G. Mecca - Tecnologie di Sviluppo per il Web 12 6 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Un Esempio m La base di dati create table utenti ( nomeUtente char(10) not null primary key, nome varchar(50), password varchar(10), ruolo varchar(50) ) Supporremo che la base di dati “universita” sia già stata creata usando, per esempio, PostgreSQL create table proprietari ( codiceFiscale char(16) not null primary key, nome varchar(50) not null, cittaDiResidenza varchar(50), annoPatente integer ) create table automobili ( targa char(7) not null primary key, modello varchar(50), cilindrata integer, proprietario char(16) not null references Proprietari(codiceFiscale) ) G. Mecca - Tecnologie di Sviluppo per il Web 13 JDBC >> Concetti Fondamentali >> Un Esempio Un Esempio m Driver ðè necessario avere a disposizione un driver JDBC ðpgjdbc2.jar, driver JDBC 2.0 di PgSQL ðpackage “org.postgresql” ðdriver di tipo 4 m Deve essere nel CLASSPATH ðin .bashrc posso ridefinire il mio CLASSPATH ð CLASSPATH=$CLASSPATH:”.:/usr/share/jdbc/pgjdbc2.jar” ð export CLASSPATH G. Mecca - Tecnologie di Sviluppo per il Web 14 7 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Un Esempio m Le classi fondamentali di JDBC ðClasse Driver Manager ðInterfaccia Driver ðInterfaccia Connection ðInterfaccia Statement ðInterfaccia PreparedStatement ðInterfaccia ResultSet ðEccezione SQLException G. Mecca - Tecnologie di Sviluppo per il Web 15 JDBC >> Concetti Fondamentali >> Un Esempio Un Esempio m Nel seguito descriveremo le seguenti operazioni ðOperazione n.1: Caricare il driver ðOperazione n.2: Aprire una connessione ðOperazione n.3: Definire l’istruzione SQL ðOperazione n.4: Gestire il risultato ðOperazione n.5: Usare istruzioni preparate G. Mecca - Tecnologie di Sviluppo per il Web 16 8 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Operazione n.1: Caricare il Driver m Importare il pacchetto java.sql ðimport java.sql.*; m Creare un oggetto della classe Driver ðDriver d = new org.postgresql.Driver(); m Registrare il driver sul DriverManager ðvoid DriverManager.registerDriver(Driver d); m A questo punto ho disponibile il driver G. Mecca - Tecnologie di Sviluppo per il Web 17 JDBC >> Concetti Fondamentali >> Un Esempio Operazione n.2: Connessione m Ottenere una conn. dal DriverManager ðper farlo è necessario specificare a quale server, dbms e base di dati ðquale utente e quale password m URI della connessione ðspecifica server, porta e base di dati m Sintassi ðjdbc:<sottoprotocollo>:<parametri> G. Mecca - Tecnologie di Sviluppo per il Web 18 9 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Operazione n.2: Connessione m URI per PostgreSQL ðjdbc:postgresql:<baseDati> ðjdbc:postgresql://<host>/<baseDati> ðjdbc:postgresql://<host>:<porta>/<baseDati> m Esempi ðjdbc:postgresql:universita ðjdbc:postgresql://127.0.0.1/universita ðjdbc:postgresql://127.0.0.1:5432/universita G. Mecca - Tecnologie di Sviluppo per il Web 19 JDBC >> Concetti Fondamentali >> Un Esempio Operazione n.2: Connessione m Creazione della connessione ðConnection DriverManager.getConnection( String uri, String utente, String password); m Esempio ðconn = DriverManager.getConnection( “jdbc:postgresql:universita”, “pguser”, “pguser”); m Attenzione: è un’operazione costosa ðsarebbe opportuno limitare il numero di connessioni create ðnell’esempio: una connessione per ogni op. G. Mecca - Tecnologie di Sviluppo per il Web 20 10 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Nell’Esempio m La classe DataSource ðle connessioni vengono ottenute da una classe DataSource ðil suo compito è servire connessioni alle altre classi che ne hanno bisogno ðmetodo statico DataSource.getConnection() che restituisce una nuova connessione ad ogni richiesta G. Mecca - Tecnologie di Sviluppo per il Web 21 JDBC >> Concetti Fondamentali >> Un Esempio La Classe DataSource package it.unibas.acibase; import java.sql.*; public class DataSource { private static String databaseURI = "jdbc:odbc:automobili"; private static String userName = ""; private static String password = ""; public static Connection getConnection() throws SQLException { Driver driver = new sun.jdbc.odbc.JdbcOdbcDriver(); DriverManager.registerDriver(driver); Connection connection = DriverManager.getConnection(databaseURI, userName, password); return connection; } } G. Mecca - Tecnologie di Sviluppo per il Web 22 11 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Operazione n.3: Istruzione SQL m Oggetto della classe Statement ðmetodo createStatement di Connection ðStatement createStatement(); ðes: Statement st = conn.createStatement(); m Metodi per l’esecuzione dell’istruzione ðint executeUpdate(String sql); ðResultSet executeQuery(String sql); ðl’istruzione SQL è una stringa che può essere costruita dinamicamente G. Mecca - Tecnologie di Sviluppo per il Web 23 JDBC >> Concetti Fondamentali >> Un Esempio Nell’Esempio m Due componenti fondamentali ðclasse Proprietario ðclasse Automobile m Entrambi sono persistenti ðoperazioni CRUD (“Create, Retrieve, Update e Delete”) ðInserisci, Ricerca, Aggiorna, Cancella ðper ogni operazione una o più query SQL G. Mecca - Tecnologie di Sviluppo per il Web 24 12 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Nell’Esempio // Proprietario.java private private private private String codiceFiscale; String nome; String cittaDiResidenza; int annoPatente; public void inserisci() throws SQLException { Connection connection = DataSource.getConnection(); Statement statement = connection.createStatement(); String query = "insert into proprietari values ('" + codiceFiscale + "','" + nome + "','" + cittaDiResidenza + "',"+ annoPatente +")"; statement.executeUpdate(query); statement.close(); connection.close(); } G. Mecca - Tecnologie di Sviluppo per il Web 25 JDBC >> Concetti Fondamentali >> Un Esempio Nell’Esempio // Proprietario.java public void aggiorna() throws SQLException { Connection connection = DataSource.getConnection(); Statement statement = connection.createStatement(); String query = "update proprietari set “ + “codiceFiscale = '" + codiceFiscale + "'," + "nome = '" + nome + "'," + "cittaDiResidenza = '" + cittaDiResidenza + "'," + "annoPatente = " + annoPatente + " " + "where codiceFiscale = '" + codiceFiscale + "'"; statement.executeUpdate(query); statement.close(); connection.close(); } G. Mecca - Tecnologie di Sviluppo per il Web 26 13 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Operazione n.4: Gestire il Risultato m Oggetto della classe ResultSet ðrappresenta la collezione di ennuple restituita da una SELECT ðmetodo boolean next(); per scorrere le ennuple (sostituisce il cursore) ðmetodi getXXX(String attributo) per acquisire i valori degli attributi ðesempio: int getInt(String attributo); ðesempio: String getString(String attributo); G. Mecca - Tecnologie di Sviluppo per il Web 27 JDBC >> Concetti Fondamentali >> Un Esempio Nell’Esempio m Ricerca di un proprietario per nome ðviene eseguita una SELECT con la condizione che il nome sia quello cercato ðviene restituito un ResultSet ðil ResultSet viene scandito con il metodo next() ðvengono prelevate le informazioni sui proprietari da ciascuna ennupla con getString() e getInt() G. Mecca - Tecnologie di Sviluppo per il Web 28 14 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Nell’Esempio public static List ricercaPropPerNome(String nome) throws SQLException{ Connection connection = DataSource.getConnection(); List listaProprietari = new LinkedList(); Statement statement = connection.createStatement(); String query = "select * from proprietari where nome = '" + nome + "'"; ResultSet rs = statement.executeQuery(query); while (rs.next()){ Proprietario p = new Proprietario(); p.setCodiceFiscale(rs.getString("codiceFiscale")); p.setNome(rs.getString("nome")); p.setCittaDiResidenza(rs.getString("cittaDiResidenza")); p.setAnnoPatente(rs.getInt("annoPatente")); listaProprietari.add(proprietario); } statement.close(); connection.close(); return listaProprietari; } G. Mecca - Tecnologie di Sviluppo per il Web 29 JDBC >> Sommario Concetti Fondamentali m Introduzione ðArchitettura ðTipi di driver m Un Esempio ðDriver e Driver Manager ðConnection e URI ðStatement e Result Set G. Mecca - Tecnologie di Sviluppo per il Web 30 15 19/05/2003 JDBC >> Concetti Fondamentali >> Un Esempio Un Esempio m La base di dati create table utenti ( nomeUtente char(10) not null primary key, nome varchar(50), password varchar(10), ruolo varchar(50) ) create table proprietari ( codiceFiscale char(16) not null primary key, nome varchar(50) not null, cittaDiResidenza varchar(50), annoPatente integer ) create table automobili ( targa char(7) not null primary key, modello varchar(50), cilindrata integer, proprietario char(16) not null references Proprietari(codiceFiscale) ) G. Mecca - Tecnologie di Sviluppo per il Web 31 16