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);