About
Documentation
SourceForge

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