SlideShare a Scribd company logo
JDBC (java db connectivity)
Package java.sql
Struttura JDBC
Applicazione Java
Gestore driver JDBC
Bridge
JDBC/ODBC
ODBC
Driver
JDBC
specifico
database
database
url di database
per desrivere le origini dei dati JDBC utilizza degli url:
jdbc:db2:COREJAVA
in generale
jdbc:sotto protocollo:altro
il campo altro dipende dal sottoprotocollo utilizzato
Ad esepio per il driver JDBC per MySQL
jdbc:mysql://localhost/scuola?user=root&password=pippo
Nel caso del Bridge Jdbc-Odbc si usa un’origine dati odbc e un
URL del tpo:
jdbc:odbc:originedati
Connessione a un database
Per effettuare la connessione è necessario registrare una libreria
di classi fornita dal produttore, ad esempio:
org.gjt.mm.mysql.Driver
L’installazione dei driver comporta oltre alla copia dei file su disco
la modifica del classpath. Si può operare in uno dei modi seguenti:
1. Avviare l’applicazione con l’argomento –classpath
2. Modificare la variabile d’ambiente CLASSPATH ad esempio in
Linux è possibile eseguire la seguente operazione:
export CLASSPATH=/percorso/driver.jar:$CLASSPATH
3. Copiare la libreria nella directory jre/lib/ext
Nel caso del bridge jdbc-odbc
sun.jdbc.odbc.JdbcOdbcDriver
Esempio di connessione
try
{String DRIVER = "org.gjt.mm.mysql.Driver";
String URL = "jdbc:mysql://localhost/cfp";
Connection conn;
Class.forName(DRIVER);
conn = DriverManager.getConnection(URL,”root”,”pippo”);
}
catch (ClassNotFoundException cnfe)
{ ///Driver non trovato o errato}
catch(SQLException sqle)
{//problemi di connessione}
In alternativa a Class.forName(DRIVER) si può usare:
System.setProperty(“JDBC.DRIVERS”,DRIVER);
Uso di un file di properties
E’ anche possibile affidare la connessione ad un file di testo esterno di
questo tipo (database.properties)
jdbc.drivers= org.gjt.mm.mysql.Driver
jdbc.url= jdbc:mysql://localhost/scuola
jdbc.username=root
jdbc.password=pippo
Questo file può essere letto in questo modo:
Properties props = new Properties();
FileInputStream in = new FileInputStream(“database.properties”);
props.load(in);
String drivers = props.getProperty("jdbc.drivers");
if (drivers != null) System.setProperty("jdbc.drivers", drivers);
String url = props.getProperty("jdbc.url");
String username = props.getProperty("jdbc.username");
String password = props.getProperty("jdbc.password");
Connection conn;
conn=DriverManager.getConnection(url, username, password);
Esecuzione di comandi SQL
per eseguire comandi SQL (UPDATE,INSERT,DELETE,DROP,ALTER..) è
necessario creare uno Statement, ciò si ottiene dall’oggetto connection:
Statement st=conn.createStatement();
quindi è possibile utilizzare il metodo executeUpdate
int n=st.executeUpdate(“UPDATE Studenti SET Voto=100”);
System.out.println(“Righe modificate: “ +n);
(executeUpdate restituisce il numero di righe interessate alla modifica)
NOTA: è opportuno chiudere lo statement e la connessione al termine.
st.close();
cn.close();
Esecuzione di comandi SQL
per eseguire comandi SQL (CREATE,DROP,ALTER..) è più indicato
l’uso del metodo execute che non torna il numero di righe modificate,
ma ritorna:
- true se eseguo una query di SELECT
- false negli altri casi.
(il metodo execute in realtà è di utilizzo generico, quindi funziona per
qualsiasi comando SQL)
st.execute(“CREATE TABLE PROVINCE “ +
“(SIGLA CHAR(2), NOME VARCHAR(20);”);
Esercizio
Realizzare un programma con un’interfaccia AWT o swing fatta in questo
modo:
La connessione viene instaurata
all’avvio dell’applicazione, usando un
file esterno db.properties
Lo Statement aperto e chiuso ogni
volta che si esegue una query.
Eventualmente si potrebbe prevedere
di poter caricare un file di testo
contenente tante istruzioni SQL da
essere eseguite in sequenza.
Esecuzioni di query SELECT
Nell caso delle SELECT si usa il metodo executeQuery che ritorna un
oggetto di tipo ResultSet che ci permette di visualizzare il risultato
dell’operazione:
ResultSet rs=st.executeQuery(“SELECT * FROM Studenti”);
(se si devono analizzare più risultati contemporaneamete è necessario
avere più Statement: Attenzione su alcuni database ciò è impossibile ad
esempio con MS SQL Server)
Lettura di un ResultSet
Una volta istanziato un ResultSet contiene tutte le righe estratte dal database
attraverso la Query. Il ‘cursore’ inizialmente si trova prima della prima riga.
E’ possibile scorrere tutte le righe mediante un ciclo:
while (rs.next()){}
Per leggere i vari campi è possibile usare i metodi del ResultSet
String codice=rs.getString(1); //Prima colonna
Oppure analogamente
String codice=rs.getString(“Codice”); //Colonna denominata codice
Esistono metodi per tutti i tipi di dati:
getDouble(), getInt(), getBoolean()……
(Attenzione dopo aver terminato il ciclo è opportuno chiudere il ResultSet tramite il
metodo close(), allo stesso modo è opportuno chiudere una connessione al termine
dell’utilizzo)
ResultsetMetaData
in alcuni casi risulta assai comodo conoscere la struttura del database
su cui stiamo lavorando: l’elenco delle tabelle, le intestazioni e il
numero delle colonne, i tipi di dati delle colonne.
E’ necessario disporre di un oggetto ResultsetMetaData:
Per disporre di tutte le informazioni relative a una tabella:
ResultSetMetaData meta=rs.getMetaData();
un esempio semplice potrebbe essere il seguente:
for(int i=1;i<=meta.getColumnCount();i++)
{ String columnName=meta.getColumnLabel(i);
int columnWidth=meta.getColumnDisplaySize(i);
…..
}
DatabaseMetaData
Oppure nela caso fossero utili informazioni sulle tabelle conten ute in
un database è possibile utilizzare l’intefaccia DatabaseMetaData.
DatabaseMetaData meta=con.getMetaData();
un esempio semplice potrebbe essere il seguente:
ResultSet rs=meta.getTables(null,null,null,null);
while(rs.next())
{
System.out.println(rs.getString(1)+”t”+
rs.getString(3)+”t”+
rs.getString(4)
);
…..
}
Cursori scorrevoli
Le ultime versioni di Java (JDBC 2) permettono di creare degli
statement che consentono di ottenere ResultSet scorrevoli:
createStatement(int resultSetType, int resultSetConcurrency)
Concurrency resultsetType
CONCUR_READ_ONLY TYPE_FORWARD_ONLY
CONCUR_UPDATABLE TYPE_SCROLL_INSENSITI
VE
TYPE_SCROLL_SENSITIVE
Le costanti indicate sono della classe ResultSet
Statement st=con. createStatement(
ResultSet. TYPE_SCROLL_INSENSITIVE,
ResultSet. CONCUR_READ_ONLY);
Con il ResultSet così ottenuto è consentito poi utilizzare anche i metodi
first(), last(), previous(), relative(row), absolute(row)…….
PreparedStatement
Con i PreparedStatement è possibile eseguire delle query
parametriche. Si utilizza il ? Al posto di un valore e lo si assegna
successivamente.
In seguito è possibile eseguire la query con il metodo
executeUpdate(), o executeQuery().
PreparedStatement pstmt = con.prepareStatement("UPDATE
EMPLOYEES SET SALARY = ? WHERE ID = ?");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)
pstmt.executeUpdate();
CallableStatement
Permettono di eseguire delle stored procedure.
L’utilizzo è simile a quello delle PreparedStatement, viene però utilizzato un
formato particolare per indicare la procedura da utilizzare:
CallableStatemet cs=cn.prepareCall(“{?= call <procedure-
name>[<arg1>,<arg2>, ...]}” );
{call <procedure-name>[<arg1>,<arg2>, ...]}
I parametri IN vengono settati come nelle Prepared Statement con set(..)
I parametri OUT vengono settati con i metodi registerOutParameter(..)
L’eventuale risultato di ritorno è equiparato ad un OUT parameter:
Per leggete i valori ritornati dai parametri si usano i metodi getXXX(..)
Ad esempio:
CallableStatemet cs=cn.prepareCall(“{call procedura[?,?]}” );
cs.registerOutParameter(1,Types.VARCHAR);
cs.setString(1,”pippo”);
cs.setInt(2,5);
cs.execute();
String s=cs.getString(1);
Gestione delle Transazioni
In alcuni casi è importante che alcune query di aggiornamento avvengano
in sequenza senza interruzioni, o meglio, in caso anche di un sole errore
sarebbe opportuno poter annullare tutti gli aggiornamenti.
E’ possibile disabilitare l’esecuzione immediata delle query in questo
modo:
con.setAutoCommit(false);
Statement st=con.createStatement();
st.executeUpdate(SQL1);
st.executeUpdate(SQL2);
st.executeUpdate(SQL3);
con.commit(); //solo ora si ha l’esecuzione
In caso di errore si può annullare tutto tramite
con.rollback();
Esecuzione Batch
JDBC consente anche di eseguire n query in sequenza. A differenza
delle transazioni, l’esecuzione si interrompe in caso di errore sono in caso
in cui il driver usato non permettadi continuare (in tal caso si ha un
BatchUpdateException)
st.addBatch(sql1);
st.addBatch(sql2);
st.addBatch(sql3);
int risultati[]=st.executeBatch();
L’array risultati contiene i seguenti valori:
 n : numero di righe modificate, comando riuscito
-2 : comando riuscito, numero di righe modificate sconosciuto
-3 : comando non riuscito, nel caso l’esecuzione non si sia interrotta.

More Related Content

Similar to Java lezione 10

Java 04
Java 04Java 04
Java 04
davide ficano
 
Sqlite And Java
Sqlite And JavaSqlite And Java
Lezione JSP database Crud
Lezione JSP database CrudLezione JSP database Crud
Fare con Zend Framework 2 ciò che facevo con ZF1
Fare con Zend Framework 2 ciò che facevo con ZF1Fare con Zend Framework 2 ciò che facevo con ZF1
Fare con Zend Framework 2 ciò che facevo con ZF1
Steve Maraspin
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
orestJump
 
Java per as400
Java per as400Java per as400
Java per as400
Franco Lombardo
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
Federico Paparoni
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016DavideBos
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016DavideBos
 
02 Struts Actions
02  Struts  Actions02  Struts  Actions
02 Struts Actions
Federico Paparoni
 
Dispensa di PL-SQL
Dispensa di PL-SQLDispensa di PL-SQL
Dispensa di PL-SQL
Antonio Tandoi
 
Terza lezioneandroid
Terza lezioneandroidTerza lezioneandroid
SQL Server2000
SQL Server2000SQL Server2000
SQL Server2000
Maurizio Farina
 
Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M S
Laboratorio Di  Basi Di  Dati 11  P H P   Interazione Con I  D B M SLaboratorio Di  Basi Di  Dati 11  P H P   Interazione Con I  D B M S
Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M Sguestbe916c
 
Django: utilizzo avanzato e nuove funzionalità
Django: utilizzo avanzato e nuove funzionalitàDjango: utilizzo avanzato e nuove funzionalità
Django: utilizzo avanzato e nuove funzionalità
skam
 

Similar to Java lezione 10 (20)

Java 04
Java 04Java 04
Java 04
 
Corso Java 2 - AVANZATO
Corso Java 2 - AVANZATOCorso Java 2 - AVANZATO
Corso Java 2 - AVANZATO
 
Sqlite And Java
Sqlite And JavaSqlite And Java
Sqlite And Java
 
Lezione JSP database Crud
Lezione JSP database CrudLezione JSP database Crud
Lezione JSP database Crud
 
Fare con Zend Framework 2 ciò che facevo con ZF1
Fare con Zend Framework 2 ciò che facevo con ZF1Fare con Zend Framework 2 ciò che facevo con ZF1
Fare con Zend Framework 2 ciò che facevo con ZF1
 
Java codestyle & tipstricks
Java codestyle & tipstricksJava codestyle & tipstricks
Java codestyle & tipstricks
 
Php mysql3
Php mysql3Php mysql3
Php mysql3
 
Java per as400
Java per as400Java per as400
Java per as400
 
Lezione js pdatabasecrudterzaparte
Lezione js pdatabasecrudterzaparteLezione js pdatabasecrudterzaparte
Lezione js pdatabasecrudterzaparte
 
Applicazioni native in java
Applicazioni native in javaApplicazioni native in java
Applicazioni native in java
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016
 
02 Struts Actions3016
02 Struts Actions301602 Struts Actions3016
02 Struts Actions3016
 
02 Struts Actions
02  Struts  Actions02  Struts  Actions
02 Struts Actions
 
Dispensa di PL-SQL
Dispensa di PL-SQLDispensa di PL-SQL
Dispensa di PL-SQL
 
Basi Di Dati 05
Basi Di Dati 05Basi Di Dati 05
Basi Di Dati 05
 
Terza lezioneandroid
Terza lezioneandroidTerza lezioneandroid
Terza lezioneandroid
 
SQL Server2000
SQL Server2000SQL Server2000
SQL Server2000
 
eZ publish - Extension
eZ publish - ExtensioneZ publish - Extension
eZ publish - Extension
 
Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M S
Laboratorio Di  Basi Di  Dati 11  P H P   Interazione Con I  D B M SLaboratorio Di  Basi Di  Dati 11  P H P   Interazione Con I  D B M S
Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M S
 
Django: utilizzo avanzato e nuove funzionalità
Django: utilizzo avanzato e nuove funzionalitàDjango: utilizzo avanzato e nuove funzionalità
Django: utilizzo avanzato e nuove funzionalità
 

More from Sergio Ronchi

Java lezione 19
Java lezione 19Java lezione 19
Java lezione 19
Sergio Ronchi
 
Java lezione 18
Java lezione 18Java lezione 18
Java lezione 18
Sergio Ronchi
 
Java lezione 17
Java lezione 17Java lezione 17
Java lezione 17
Sergio Ronchi
 
Java lezione 16
Java lezione 16Java lezione 16
Java lezione 16
Sergio Ronchi
 
Java lezione 15
Java lezione 15Java lezione 15
Java lezione 15
Sergio Ronchi
 
Java lezione 14
Java lezione 14Java lezione 14
Java lezione 14
Sergio Ronchi
 
Java lezione 13
Java lezione 13Java lezione 13
Java lezione 13
Sergio Ronchi
 
Java lezione 12
Java lezione 12Java lezione 12
Java lezione 12
Sergio Ronchi
 
Java lezione 11
Java lezione 11Java lezione 11
Java lezione 11
Sergio Ronchi
 
Java lezione 9
Java lezione 9Java lezione 9
Java lezione 9
Sergio Ronchi
 
Java lezione 8
Java lezione 8Java lezione 8
Java lezione 8
Sergio Ronchi
 
Java lezione 7
Java lezione 7Java lezione 7
Java lezione 7
Sergio Ronchi
 
Java lezione 6
Java lezione 6Java lezione 6
Java lezione 6
Sergio Ronchi
 
Java lezione 5
Java lezione 5Java lezione 5
Java lezione 5
Sergio Ronchi
 
Java lezione 4
Java lezione 4Java lezione 4
Java lezione 4
Sergio Ronchi
 
Java lezione 3
Java lezione 3Java lezione 3
Java lezione 3
Sergio Ronchi
 
Java lezione 2
Java lezione 2Java lezione 2
Java lezione 2
Sergio Ronchi
 
Java introduzione
Java introduzioneJava introduzione
Java introduzione
Sergio Ronchi
 
Java Lezione 1
Java Lezione 1Java Lezione 1
Java Lezione 1
Sergio Ronchi
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
Sergio Ronchi
 

More from Sergio Ronchi (20)

Java lezione 19
Java lezione 19Java lezione 19
Java lezione 19
 
Java lezione 18
Java lezione 18Java lezione 18
Java lezione 18
 
Java lezione 17
Java lezione 17Java lezione 17
Java lezione 17
 
Java lezione 16
Java lezione 16Java lezione 16
Java lezione 16
 
Java lezione 15
Java lezione 15Java lezione 15
Java lezione 15
 
Java lezione 14
Java lezione 14Java lezione 14
Java lezione 14
 
Java lezione 13
Java lezione 13Java lezione 13
Java lezione 13
 
Java lezione 12
Java lezione 12Java lezione 12
Java lezione 12
 
Java lezione 11
Java lezione 11Java lezione 11
Java lezione 11
 
Java lezione 9
Java lezione 9Java lezione 9
Java lezione 9
 
Java lezione 8
Java lezione 8Java lezione 8
Java lezione 8
 
Java lezione 7
Java lezione 7Java lezione 7
Java lezione 7
 
Java lezione 6
Java lezione 6Java lezione 6
Java lezione 6
 
Java lezione 5
Java lezione 5Java lezione 5
Java lezione 5
 
Java lezione 4
Java lezione 4Java lezione 4
Java lezione 4
 
Java lezione 3
Java lezione 3Java lezione 3
Java lezione 3
 
Java lezione 2
Java lezione 2Java lezione 2
Java lezione 2
 
Java introduzione
Java introduzioneJava introduzione
Java introduzione
 
Java Lezione 1
Java Lezione 1Java Lezione 1
Java Lezione 1
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 

Java lezione 10

  • 1. JDBC (java db connectivity) Package java.sql
  • 2. Struttura JDBC Applicazione Java Gestore driver JDBC Bridge JDBC/ODBC ODBC Driver JDBC specifico database database
  • 3. url di database per desrivere le origini dei dati JDBC utilizza degli url: jdbc:db2:COREJAVA in generale jdbc:sotto protocollo:altro il campo altro dipende dal sottoprotocollo utilizzato Ad esepio per il driver JDBC per MySQL jdbc:mysql://localhost/scuola?user=root&password=pippo Nel caso del Bridge Jdbc-Odbc si usa un’origine dati odbc e un URL del tpo: jdbc:odbc:originedati
  • 4. Connessione a un database Per effettuare la connessione è necessario registrare una libreria di classi fornita dal produttore, ad esempio: org.gjt.mm.mysql.Driver L’installazione dei driver comporta oltre alla copia dei file su disco la modifica del classpath. Si può operare in uno dei modi seguenti: 1. Avviare l’applicazione con l’argomento –classpath 2. Modificare la variabile d’ambiente CLASSPATH ad esempio in Linux è possibile eseguire la seguente operazione: export CLASSPATH=/percorso/driver.jar:$CLASSPATH 3. Copiare la libreria nella directory jre/lib/ext Nel caso del bridge jdbc-odbc sun.jdbc.odbc.JdbcOdbcDriver
  • 5. Esempio di connessione try {String DRIVER = "org.gjt.mm.mysql.Driver"; String URL = "jdbc:mysql://localhost/cfp"; Connection conn; Class.forName(DRIVER); conn = DriverManager.getConnection(URL,”root”,”pippo”); } catch (ClassNotFoundException cnfe) { ///Driver non trovato o errato} catch(SQLException sqle) {//problemi di connessione} In alternativa a Class.forName(DRIVER) si può usare: System.setProperty(“JDBC.DRIVERS”,DRIVER);
  • 6. Uso di un file di properties E’ anche possibile affidare la connessione ad un file di testo esterno di questo tipo (database.properties) jdbc.drivers= org.gjt.mm.mysql.Driver jdbc.url= jdbc:mysql://localhost/scuola jdbc.username=root jdbc.password=pippo Questo file può essere letto in questo modo: Properties props = new Properties(); FileInputStream in = new FileInputStream(“database.properties”); props.load(in); String drivers = props.getProperty("jdbc.drivers"); if (drivers != null) System.setProperty("jdbc.drivers", drivers); String url = props.getProperty("jdbc.url"); String username = props.getProperty("jdbc.username"); String password = props.getProperty("jdbc.password"); Connection conn; conn=DriverManager.getConnection(url, username, password);
  • 7. Esecuzione di comandi SQL per eseguire comandi SQL (UPDATE,INSERT,DELETE,DROP,ALTER..) è necessario creare uno Statement, ciò si ottiene dall’oggetto connection: Statement st=conn.createStatement(); quindi è possibile utilizzare il metodo executeUpdate int n=st.executeUpdate(“UPDATE Studenti SET Voto=100”); System.out.println(“Righe modificate: “ +n); (executeUpdate restituisce il numero di righe interessate alla modifica) NOTA: è opportuno chiudere lo statement e la connessione al termine. st.close(); cn.close();
  • 8. Esecuzione di comandi SQL per eseguire comandi SQL (CREATE,DROP,ALTER..) è più indicato l’uso del metodo execute che non torna il numero di righe modificate, ma ritorna: - true se eseguo una query di SELECT - false negli altri casi. (il metodo execute in realtà è di utilizzo generico, quindi funziona per qualsiasi comando SQL) st.execute(“CREATE TABLE PROVINCE “ + “(SIGLA CHAR(2), NOME VARCHAR(20);”);
  • 9. Esercizio Realizzare un programma con un’interfaccia AWT o swing fatta in questo modo: La connessione viene instaurata all’avvio dell’applicazione, usando un file esterno db.properties Lo Statement aperto e chiuso ogni volta che si esegue una query. Eventualmente si potrebbe prevedere di poter caricare un file di testo contenente tante istruzioni SQL da essere eseguite in sequenza.
  • 10. Esecuzioni di query SELECT Nell caso delle SELECT si usa il metodo executeQuery che ritorna un oggetto di tipo ResultSet che ci permette di visualizzare il risultato dell’operazione: ResultSet rs=st.executeQuery(“SELECT * FROM Studenti”); (se si devono analizzare più risultati contemporaneamete è necessario avere più Statement: Attenzione su alcuni database ciò è impossibile ad esempio con MS SQL Server)
  • 11. Lettura di un ResultSet Una volta istanziato un ResultSet contiene tutte le righe estratte dal database attraverso la Query. Il ‘cursore’ inizialmente si trova prima della prima riga. E’ possibile scorrere tutte le righe mediante un ciclo: while (rs.next()){} Per leggere i vari campi è possibile usare i metodi del ResultSet String codice=rs.getString(1); //Prima colonna Oppure analogamente String codice=rs.getString(“Codice”); //Colonna denominata codice Esistono metodi per tutti i tipi di dati: getDouble(), getInt(), getBoolean()…… (Attenzione dopo aver terminato il ciclo è opportuno chiudere il ResultSet tramite il metodo close(), allo stesso modo è opportuno chiudere una connessione al termine dell’utilizzo)
  • 12. ResultsetMetaData in alcuni casi risulta assai comodo conoscere la struttura del database su cui stiamo lavorando: l’elenco delle tabelle, le intestazioni e il numero delle colonne, i tipi di dati delle colonne. E’ necessario disporre di un oggetto ResultsetMetaData: Per disporre di tutte le informazioni relative a una tabella: ResultSetMetaData meta=rs.getMetaData(); un esempio semplice potrebbe essere il seguente: for(int i=1;i<=meta.getColumnCount();i++) { String columnName=meta.getColumnLabel(i); int columnWidth=meta.getColumnDisplaySize(i); ….. }
  • 13. DatabaseMetaData Oppure nela caso fossero utili informazioni sulle tabelle conten ute in un database è possibile utilizzare l’intefaccia DatabaseMetaData. DatabaseMetaData meta=con.getMetaData(); un esempio semplice potrebbe essere il seguente: ResultSet rs=meta.getTables(null,null,null,null); while(rs.next()) { System.out.println(rs.getString(1)+”t”+ rs.getString(3)+”t”+ rs.getString(4) ); ….. }
  • 14. Cursori scorrevoli Le ultime versioni di Java (JDBC 2) permettono di creare degli statement che consentono di ottenere ResultSet scorrevoli: createStatement(int resultSetType, int resultSetConcurrency) Concurrency resultsetType CONCUR_READ_ONLY TYPE_FORWARD_ONLY CONCUR_UPDATABLE TYPE_SCROLL_INSENSITI VE TYPE_SCROLL_SENSITIVE Le costanti indicate sono della classe ResultSet Statement st=con. createStatement( ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet. CONCUR_READ_ONLY); Con il ResultSet così ottenuto è consentito poi utilizzare anche i metodi first(), last(), previous(), relative(row), absolute(row)…….
  • 15. PreparedStatement Con i PreparedStatement è possibile eseguire delle query parametriche. Si utilizza il ? Al posto di un valore e lo si assegna successivamente. In seguito è possibile eseguire la query con il metodo executeUpdate(), o executeQuery(). PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592) pstmt.executeUpdate();
  • 16. CallableStatement Permettono di eseguire delle stored procedure. L’utilizzo è simile a quello delle PreparedStatement, viene però utilizzato un formato particolare per indicare la procedura da utilizzare: CallableStatemet cs=cn.prepareCall(“{?= call <procedure- name>[<arg1>,<arg2>, ...]}” ); {call <procedure-name>[<arg1>,<arg2>, ...]} I parametri IN vengono settati come nelle Prepared Statement con set(..) I parametri OUT vengono settati con i metodi registerOutParameter(..) L’eventuale risultato di ritorno è equiparato ad un OUT parameter: Per leggete i valori ritornati dai parametri si usano i metodi getXXX(..) Ad esempio: CallableStatemet cs=cn.prepareCall(“{call procedura[?,?]}” ); cs.registerOutParameter(1,Types.VARCHAR); cs.setString(1,”pippo”); cs.setInt(2,5); cs.execute(); String s=cs.getString(1);
  • 17. Gestione delle Transazioni In alcuni casi è importante che alcune query di aggiornamento avvengano in sequenza senza interruzioni, o meglio, in caso anche di un sole errore sarebbe opportuno poter annullare tutti gli aggiornamenti. E’ possibile disabilitare l’esecuzione immediata delle query in questo modo: con.setAutoCommit(false); Statement st=con.createStatement(); st.executeUpdate(SQL1); st.executeUpdate(SQL2); st.executeUpdate(SQL3); con.commit(); //solo ora si ha l’esecuzione In caso di errore si può annullare tutto tramite con.rollback();
  • 18. Esecuzione Batch JDBC consente anche di eseguire n query in sequenza. A differenza delle transazioni, l’esecuzione si interrompe in caso di errore sono in caso in cui il driver usato non permettadi continuare (in tal caso si ha un BatchUpdateException) st.addBatch(sql1); st.addBatch(sql2); st.addBatch(sql3); int risultati[]=st.executeBatch(); L’array risultati contiene i seguenti valori:  n : numero di righe modificate, comando riuscito -2 : comando riuscito, numero di righe modificate sconosciuto -3 : comando non riuscito, nel caso l’esecuzione non si sia interrotta.