Ecco giunti all'ultima tappa del percorso introduttivo su HTML, PHP e gestione di dati su MySQL:
L'accesso ai dati e la visualizzazione delle informazioni contenute nel database tramite pagine dinamiche scritte in PHP.
Ecco giunti all'ultima tappa del percorso introduttivo su HTML, PHP e gestione di dati su MySQL:
L'accesso ai dati e la visualizzazione delle informazioni contenute nel database tramite pagine dinamiche scritte in PHP.
Come aggiornare i dati di una tabella relazionale prima di chiavi straniere. Le quattro operazioni fondamentali. CRUD. Visualizzare una lista di righe della tabella relazionale, inserire una nuova riga, ricercare un record conoscendo la sua chiave primaria. Modificare e annullare
Fare con Zend Framework 2 ciò che facevo con ZF1Steve Maraspin
Introduzione a Zend Framework 2 per chi proviene da Zend Framework 1, tenuta allo Zend Framework Day di Milano del 01/02/2013. Introduzione alle nuove caratteristiche e pattern architetturali di ZF2
Zend Framework 2 non è l'evoluzione di ZF, ma un progetto nuovo: il codice è stato riscritto e poche sono le parti in comune con la versione precedente. Lo sviluppatore abituato a ZF1 non ha vita facile, ed è fondato il timore di dover imparare tutto da capo. In questo talk vediamo come cambiare le vecchie abitudini di sviluppatori ZF1, per sfruttare al meglio le potenzialità del nuovo strumento. Attraverso esempi concreti, in cui vedremo all'opera i nuovi pattern e le best practice, mostriamo come - partendo con il piede giusto - il passaggio a ZF2 possa essere meno traumatico del previsto. Il talk è orientato soprattutto a chi già conosce ZF1, ma gli argomenti affrontati possono essere utili anche a chi si avvicina a ZF per la prima volta.
Django: utilizzo avanzato e nuove funzionalitàskam
Django è uno dei framework web più apprezzati e utilizzati dalla comunità Python (e non solo).
I suoi punti di forza sono rappresentati dal suo utilizzo rapido e intuitivo, l'ottima documentazione e una larga comunità di sviluppatori ed utilizzatori.
A più di un anno di distanza dal rilascio della versione 0.96 le feature e i miglioramenti introdotti sono stati molti.
La presentazione mostra alcune di queste novità e l'utilizzo avanzato di alcuni componenti del framework.
Come aggiornare i dati di una tabella relazionale prima di chiavi straniere. Le quattro operazioni fondamentali. CRUD. Visualizzare una lista di righe della tabella relazionale, inserire una nuova riga, ricercare un record conoscendo la sua chiave primaria. Modificare e annullare
Fare con Zend Framework 2 ciò che facevo con ZF1Steve Maraspin
Introduzione a Zend Framework 2 per chi proviene da Zend Framework 1, tenuta allo Zend Framework Day di Milano del 01/02/2013. Introduzione alle nuove caratteristiche e pattern architetturali di ZF2
Zend Framework 2 non è l'evoluzione di ZF, ma un progetto nuovo: il codice è stato riscritto e poche sono le parti in comune con la versione precedente. Lo sviluppatore abituato a ZF1 non ha vita facile, ed è fondato il timore di dover imparare tutto da capo. In questo talk vediamo come cambiare le vecchie abitudini di sviluppatori ZF1, per sfruttare al meglio le potenzialità del nuovo strumento. Attraverso esempi concreti, in cui vedremo all'opera i nuovi pattern e le best practice, mostriamo come - partendo con il piede giusto - il passaggio a ZF2 possa essere meno traumatico del previsto. Il talk è orientato soprattutto a chi già conosce ZF1, ma gli argomenti affrontati possono essere utili anche a chi si avvicina a ZF per la prima volta.
Django: utilizzo avanzato e nuove funzionalitàskam
Django è uno dei framework web più apprezzati e utilizzati dalla comunità Python (e non solo).
I suoi punti di forza sono rappresentati dal suo utilizzo rapido e intuitivo, l'ottima documentazione e una larga comunità di sviluppatori ed utilizzatori.
A più di un anno di distanza dal rilascio della versione 0.96 le feature e i miglioramenti introdotti sono stati molti.
La presentazione mostra alcune di queste novità e l'utilizzo avanzato di alcuni componenti del framework.
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.