+ All Categories
Home > Documents > Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase...

Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase...

Date post: 16-Feb-2019
Category:
Upload: duongdang
View: 217 times
Download: 0 times
Share this document with a friend
25
[email protected] Ingegneria del Software: JDBC
Transcript
Page 1: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

[email protected]

Ingegneria del Software: JDBC

Page 2: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 2

Che cosa è JDBC

o  Un insieme di API standard per accedere ai database relazionali

o  Separa e nasconde i dettagli dello specifico database all’applicazione che lo utilizza

o  Parte di J2SE

o  Java SE 6 ha JDBC 4

o  JDBC: Java DataBase Connectivity

Page 3: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3

JDBC: le API o  Definisce un insieme di Interfacce Java che devono essere

implementate dal fornitore dello specifico database ottenendo i cosiddetti “driver”.

o  Le applicazioni usano direttamente le interfacce Java per effettuare le operazioni verso il db: viene garantita la portabilità

o  Le API JDBC sono organizzate in due package:

n  java.sql package che contiene

o  DriverManager, Connection, ResultSet, DatabaseMetaData, ResultSetMetaData, PreparedStatement, CallableStatement e Types

n  javax.sql package che contiene

o  DataSource

Page 4: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 4

JDBC: architettura

o  JDBC supporta sia il modello a due che a tre livelli

DB

Applicazione Java

JDBC

DB

Application server (Java)

JDBC

Applicazione Java oppure

browser HTML

Protocollo proprietario DB

DB server

Applicazione client

Applicazione client

Protocollo proprietario DB

DB server

Applicazione server

Protocollo HTTP, RMI…

Page 5: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 5

JDBC: il driver

o  Implementazione delle interfacce JDBC per uno specifico database

o  Ogni database server ha il suo corrispondente driver JDBC

o  Elenco dei driver disponibili all’indirizzo: http://developers.sun.com/product/jdbc/drivers

Page 6: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 6

JDBC: tipi di driver o  Varie implementazioni di driver JDBC divisi in categorie:

o  Tipo 1 – implementa le API JDBC come una mappatura ad altre API di acceso, come ODBC. Questo tipo di driver di solito dipende da librerie native che ne limitano la portabilità. Il bridge JDBC-ODBC è un esempio di questo tipo.

o  Tipo 2 – scritto parte in Java e parte in codice nativo. Usa librerie native specifiche del DB a cui si deve connettere. Anche in questo caso si ha limitazione della portabilità.

o  Tipo 3 – scritto in Java come un client che si connette ad un server middleware usando un protocollo indipendente dal DB. Il server middleware comunica poi con il DB usando il protocollo specifico del DB.

o  Tipo 4 – scritto in Java e implementa il protocollo per l’accesso di rete allo specifico DB. Il client si può connettere direttamente al DB.

Page 7: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 7

JDBC: l’URL del Data Base

o  Serve per effettuare la connessione al database

o  Contiene informazioni su server, porta, protocollo etc… jdbc:subprotocol_name:driver_dependant_dbname

o  Esempi: n  Oracle (thin driver)

jdbc:oracle:thin:@localhost:1521:sample

n  Derby jdbc:derby://localhost:1527/sample

n  Mysql jdbc:mysql://localhost:3306/sample

Page 8: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 8

Usare JDBC

1.  Caricare il driver specifico per il DB

2.  Ottenere un oggetto di tipo Connection

3.  Ottenere un oggetto di tipo Statement

4.  Eseguire la query

5.  Leggere i risultati

6.  Leggere i metadati (se necessario)

7.  Chiudere gli oggetti Statement e Connection

Page 9: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 9

Caricare il driver

o  Per caricare il driver e registrarlo presso il DriverManager occorre caricare la sua classe utilizzando l’istruzione: Class.forName(String database-driver-class);

o  Esempio:

try { // Carica un’istanza del driver di Mysql. // Il driver deve essere nella classpath. Class.forName("org.gjt.mm.mysql.Driver"); } catch (ClassNotFoundException cnfe) { System.out.println("" + cnfe);

}

Page 10: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 10

Ottenere la connessione o  La classe DriverManager e’ responsabile di selezionare il DB e

di creare la connessione, passando al metodo getConnection l’URL del DB, utente e password:

DriverManager.getConnection (String url, String user, String password)

o  Esempio:

try { Connection connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/sample”, “user1”, “pwd1”);

} catch(SQLException sqle) { System.out.println("" + sqle); }

o  Alternativamente e’ possibile usare un oggetto DataSource per ottenere la connessione

Page 11: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 11

DriverManager e Connection

o  Metodi di java.sql.DriverManager: n  getConnection(String url, String user, String

password) throws SQLException

o  Metodi di java.sql.Connection: n  Statement createStatement() throws SQLException n  void close() throws SQLException n  void setAutoCommit(boolean b) throws SQLException n  void commit() throws SQLException n  void rollback() throws SQLException

Page 12: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 12

Ottenere l’oggetto Statement

o  L’oggetto di tipo Statement si ottiene dall’oggetto di tipo Connection:

Statement statement = connection.createStatement();

o  Metodi di java.sql.Statement: n  ResultSet executeQuery(string sql) n  int executeUpdate(String sql)

o  Lo stesso oggetto di tipo Statement può essere utilizzato per molte query anche tra loro scollegate.

Page 13: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 13

Eseguire la query o  SELECT:

n  usare il metodo executeQuery(String query) o  Esempio:

n  ResultSet rs = statement.executeQuery("select * from customer");

n  L’oggetto ResultSet rappresenta il risultato della query in forma tabellare; la tabella può essere vuota ma mai null

o  INSERT/UPDATE/DELETE: n  usare il metodo executeUpdate(String query)

o  Esempio: n  int iReturnValue = statement.executeUpdate("update

customer set name = ‘ROSSI' where customer_code = 1234567");

n  Restituisce il numero di righe modificate nel DB in seguito all’esecuzione del comando

n  Supporta anche i comandi DDL (Data definition Language) come CREATE, DROP, ALTER

Page 14: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 14

Leggere i risultati (1) o  Si cicla attraverso il ResultSet per recuperare i dati

o  Metodi di java.sql.ResultSet: n  boolean next() n  xxx getXxx(int columnNumber) n  xxx getXxx(String columnName) n  void close()

o  L’iteratore e’ inizializzato nella posizione che si trova prima della prima riga

o  Occorre chiamare next() una volta per posizionarsi sulla prima riga

Page 15: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 15

Leggere i risultati (2)

o  Esempio:

while (rs.next()){ // Sbagliato: la prima colonna ha indice 1 e non 0 String value0 = rs.getString(0); // Corretto! String value1 = rs.getString(1); int value2 = rs.getInt(2); double value3 = rs.getDouble(3); }

Page 16: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 16

Leggere i risultati (3)

o  Usare gli appropriati metodi getXxx() quando si leggono i dati dal ResultSet n  getString()

n  getInt() n  getDouble() n  getObject()

o  Esiste un appropriato metodo getXxx() per ogni tipo di dato SQL definito nella classe java.sql.Types

Page 17: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 17

Leggere i metadati o  Tramite l’oggetto ResultSet è possibile ottenere i

metadati (cioè i tipi e le proprietà) delle colonne che compongono il ResultSet che si sta leggendo.

ResultSetMetaData rsMeta = rs.getMetaData();

o  Tramite l’oggetto Connection è possibile ottenere i metadati del database che si sta utilizzando.

DatabaseMetaData dbmetadata = connection.getMetaData();

Page 18: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 18

Leggere i metadati: esempio

ResultSetMetaData meta = rs.getMetaData(); //Restituisce il numero di colonne int iColumnCount = meta.getColumnCount();

for (int i =1 ; i <= iColumnCount ; i++){ System.out.println(“Column Name: " +

meta.getColumnName(i)); System.out.println(“Column Type" +

meta.getColumnType(i)); System.out.println("Display Size: " +

meta.getColumnDisplaySize(i) ); System.out.println("Precision: " +

meta.getPrecision(i)); System.out.println(“Scale: " + meta.getScale(i) ); }

Page 19: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 19

DataSource o  Un oggetto di tipo DataSource è un “fabbricatore” (factory) di

connessioni verso il database che rappresenta.

n  L’interfaccia javax.sql.DataSource è presente nelle API JDBC

n  L’oggetto è implementato nel driver (fatto dal fornitore del database)

o  Esistono tre tipi di possibili implementazioni:

n  Implementazione base: produce oggetti Connection standard (come quelli che si ottengono da DriverManager)

n  Implementazione con pool di connessioni: produce oggetti Connection che partecipano ad un pool di connessioni

n  Implementazione con transazioni distribuite: produce oggetti Connection che possono essere utilizzati per gestire transazioni distribuite e che partecipano ad un pool di connessioni

Page 20: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 20

DataSource: proprietà

o  Un oggetto di tipo DataSource ha proprietà che possono essere modificate quando è necessario: n  URL del database n  Nome del database n  Protocollo di rete da utilizzare per collegarsi al database

o  Queste proprietà sono definite in un file di configurazione del container

o  In Tomcat sono definite nel file server.xml presente nella cartella: <TOMCAT_HOME>/conf/server.xml

o  Vantaggio: se voglio cambiare il DB a cui collegarmi mi basta modificare le proprietà nel file di configurazione senza modificare il codice!

Page 21: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 21

Pool di connessioni

o  Creare e poi distruggere una singola connessione per ogni operazione da effettuare verso il database è un processo che consuma tempo e risorse

o  Usando un pool di connessioni invece si ha un insieme di connessioni : n  già create e disponibili al momento dell’utilizzo

risparmiando sui tempi di creazione e distruzione n  condivisibili da i vari clienti; ciascuna connessione è

riciclabile n  limitate ma espandibili in numero se necessario (per

risparmiare sulle risorse)

Page 22: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 22

Le transazioni

o  Dopo l’esecuzione di un’istruzione SQL, le modifiche sono automaticamente committate nel database

o  Per raggruppare due o più istruzioni in un’unica transazione occorre disattivare tale automatismo: connection.setAutoCommit(false)

o  A questo punto è necessario chiamare : n  commit() per registrare permanentemente i

cambiamenti n  rollback() per ripristinare la situazione

precedente

Page 23: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 23

Le transazioni: esempio Connection connection = DriverManager.getConnection(url, username, passwd); connection.setAutoCommit(false); try {

statement.executeUpdate(...); statement.executeUpdate(...); connection.commit();

} catch (Exception e) { try { connection.rollback(); } catch (SQLException sqle) { // report problem }

} finally { try { connection.close(); } catch (SQLException sqle) { }

}

Page 24: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 24

PreparedStatement

o  Se è necessario eseguire più volte delle istruzioni SQL simili, è conveniente utilizzare le query “parametrizzate” (prepared statement)

o  Si crea una query in forma standard che è inviata al database per la compilazione prima che sia effettivamente usata.

o  Ogni volta che la si deve utilizzare basta sostituire i parametri utilizzando gli opportuni metodi setXxx()

o  Poiché PreparedStatement eredita da Statement i metodi execute non hanno parametri n  executeQuery() n  executeUpdate()

Page 25: Ingegneria del Software: JDBC - Capitolo8 Bacci.pdf · o Java SE 6 ha JDBC 4 o JDBC: Java DataBase Connectivity . A.A. 2010/2011 L.Bacci - IS - Capitolo 8 3 ... produce oggetti Connection

A.A. 2010/2011 L.Bacci - IS - Capitolo 8 25

PreparedStatement: esempio Connection connection = DriverManager.getConnection(url, user, password); PreparedStatement statement =

connection.prepareStatement("UPDATE employees "+ "SET salary = ? " + "WHERE id = ?");

int[] newSalaries = getSalaries(); int[] employeeIDs = getIDs(); for(int i=0; i<employeeIDs.length; i++) {

statement.setInt(1, newSalaries[i]); statement.setInt(2, employeeIDs[i]); statement.executeUpdate();

}


Recommended