Introduzione
La libreria jdbc-utils fornisce alcune implementazioni
di uso comune dell'interfaccia ResultSetHandler presenti
all'interno del package net.sourceforge.jdbcutils.handlers.
FirstRow2Map
Trasforma la prima riga di un java.sql.ResultSet
in una java.lang.Map, dove le chiavi sono rappresentati dai nomi delle colonne
ed i valori, i valori delle stesse.
Un breve esempio di utilizzo:
Connection conn = ...;
ParaStatement st = new ParaStatement("select * from mytable where id=${id, integer, 0}");
Map params = ...;
...
FirstRow2Map fr2m = new FirstRow2Map();
Map values = (Map) st.query(conn, params, fr2m);
OutputStreamHandler
È una classe astratta il cui scopo è quello di fornire
allo sviluppatore un oggetto che debba redirigere i dati ottenuti nel ResultSet.
jdbc-utils ne contiene alcune implementazioni che sono descritte in seguito.
AVVERTENZA: L'handler NON si preoccupa di chiudere l'OutputStream, questa è un'operazione delegata
allo sviluppatore.
ResultSet2CSV
Implementazione di OutputStreamHandler,
trasforma un ResultSet in un flusso di dati CSV (Comma Separated Values)
direttamente all'interno di un OutputStream.
La potenza del metodo stà nello scrivere la riga CSV man mano che venga
letta una riga del ResultSet che si sta analizzando,
riducendo quindi al minimo i tempi di esecuzione di tale operazione.
Un breve esempio di utilizzo:
Connection conn = ...;
ParaStatement st = new ParaStatement("select * from mytable where id=${id, integer, 0}");
Map params = ...;
...
OutputStreamHandler converter = new ResultSet2CSV();
converter.setOutputStream(System.out); // lo stream al quale redirigere il flusso XML
st.query(conn, params, converter);
Il carattere di default, utilizzato per separare i valori, è ;, ma è
possibile customizzarlo a seconda delle necessità:
FileOutputStream fos = new FileOutputStream("myres.txt");
OutputStreamHandler converter = new ResultSet2CSV('*');
converter.setOutputStream(fos); // lo stream al quale redirigere il flusso XML
st.query(conn, params, converter);
fos.close();
ResultSet2JSON
Altra implementazione di OutputStreamHandler,
trasforma un ResultSet in un flusso di dati JSON
all'interno di un OutputStream.
La potenza del metodo stà nell'eseguire la trasformazione man mano che venga letto il ResultSet,
generando porzioni del documento ogni volta che si analizza una riga da quest'ultimo,
riducendo quindi al minimo i tempi di esecuzione di tale operazione.
Un breve esempio di utilizzo:
Connection conn = ...;
ParaStatement st = new ParaStatement("select * from mytable where id=${id, integer, 0}");
Map params = ...;
...
OutputStreamHandler converter = new ResultSet2JSON();
converter.setOutputStream(System.out); // lo stream al quale redirigere il flusso JSON
st.query(conn, params, converter);
La struttura dati JSON prodotto nello stream avrà la seguente struttura:
{
"result-set":
[
{
"field1": "string value 1",
"field2": 123,
"field3": true,
"field4": null,
...
},
...
{
"field1": "string value n",
"field2": 789456,
"field3": false,
"field4": null,
...
}
]
}
ResultSet2XML
Implementazione di OutputStreamHandler,
trasforma, utilizzando le API TRaX, un ResultSet in un flusso di dati XML
all'interno di un OutputStream.
La potenza del metodo stà nell'eseguire la trasformazione man mano che venga letto il ResultSet,
generando porzioni del documento ogni volta che si analizza una riga da quest'ultimo,
riducendo quindi al minimo i tempi di esecuzione di tale operazione.
Un breve esempio di utilizzo:
Connection conn = ...;
ParaStatement st = new ParaStatement("select * from mytable where id=${id, integer, 0}");
Map params = ...;
...
OutputStreamHandler converter = new ResultSet2XML();
converter.setOutputStream(System.out); // lo stream al quale redirigere il flusso XML
st.query(conn, params, converter);
Il documento XML prodotto nello stream avrà la seguente struttura:
<?xml version="1.0" encoding="UTF-8"?>
<result-set>
<row>
<field1>value</field1>
<field2>value</field2>
<field3>value</field3>
...
<fieldn>value</fieldn>
</row>
<row>
...
</row>
</result-set>
È comunque possibile customizzare il documento specificando i nomi dei tag root
e di ogni singolo item:
converter.SetRootRowNames("myRootName", "myRowName");
In questo modo il documento apparirà nella forma seguente:
<?xml version="1.0" encoding="UTF-8"?>
<myRootName>
<myRowName>
<field1>value</field1>
<field2>value</field2>
<field3>value</field3>
...
<fieldn>value</fieldn>
</myRowName>
<myRowName>
...
</myRowName>
</myRootName>
La potenza dello strumento stà inoltre nel poter applicare un foglio di stile XSL per poter trasformare il documento XML risultante:
FileOutputStream fos = new FileOutputStream("myres.xml");
ResultSet2XML converter = new ResultSet2XML();
converter.setXSL(new File("/path/to/my/xslt/file.xsl"));
converter.setOutputStream(fos); // lo stream al quale redirigere il flusso XML
st.query(conn, params, converter);
fos.close();
Infine, allo stesso foglio di stile è possibile passare dei parametri:
Map xslP = new HashMap();
xslP.put("test", new Date());
FileOutputStream fos = new FileOutputStream("myres.xml");
ResultSet2XML converter = new ResultSet2XML();
converter.setXSL(new File("/path/to/my/xslt/file.xsl"));
converter.setOutputStream(fos); // lo stream al quale redirigere il flusso XML
converter.setXslParams(xslP);
st.query(conn, params, converter);
fos.close();
BinaryStreamHandler
Implementazione di OutputStreamHandler, serve per redirigere dati binary contenuti
all'interno di una colonna in una tabella, verso un OutputStream.
Il metodo di utilizzo è simile a quelli visti precedentemente:
Connection conn = ...;
ParaStatement st = new ParaStatement("select binaryData from mytable where id=${id, integer, 0}");
Map params = ...;
...
OutputStreamHandler converter = new BinaryStreamHandler();
FileOutputStream fos = new FileOutputStream("myres.xml");
converter.setOutputStream(fos); // lo stream al quale redirigere il flusso XML
st.query(conn, params, converter);
fos.close();
ResultSet2TableModel
Trasforma il ResultSet ottenuto dalla query in un TableModel
utilizzabile all'interno di applicazioni grafiche che utilizzino le API swing.
Tale modello è una istanza del modello di default implementato nelle JFC, ovvero
DefaultTableModel, in cui le label delle colonne sono i nomi dei campi richiesti nelle query.
Il metodo di utilizzo è abbastanza semplice:
Connection conn = ...;
ParaStatement st = new ParaStatement("select * from mytable where id=${id, integer, 0}");
Map params = ...;
...
TableModel m = (TableModel) st.query(conn, params, new ResultSet2TableModel());
JTable t = new JTable();
t.setModel(m);
JScrollPane scroll = new JScrollPane(t);
f.getContentPane().add(scroll, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.pack();
f.setVisible(true);
jdbc-utils