About
Documentation
SourceForge

Samples

Iniziamo con il concetto di ResultSetHandler, ovvero qualcosa che sia in grado di processare un java.sql.ResulSet con lo scopo di separare la logica di estrazione dei dati dal DB da quella del manipolazione degli stessi; jdbc-utils fornisce una interfaccia net.sourceforge.jdbcutils.ResultSetHandler con un solo metodo void handle(java.sql.ResultSet): implementazioni di questa interfaccia saranno utili per la manipolazione dei dati.
Procediamo quindi con la costruzione di una query singola: viene dichiarato un oggetto ParaStatement nella maniera seguente:

ParaStatement ps = new ParaStatement("SELECT * FROM myTable WHERE id>${id,integer,0} ORDER BY id DESC");

In questo modo all'interno di ps viene creata una query parametrizzabile;
Una volta ottenuta una connessione su un DB, siamo in grado di poter eseguire una query:

Connection conn = ... // recupero la connessione
ResultSetHandler myRSH = new MyRSH(); // oggetto che implementa un net.sourceforge.jdbcutils.ResultSetHandler
Map params = new HashMap(); // map che contiene gli oggetti che verranno usati per la formattazione
params.put("id", "123"); // inseriamo la chiave ed il valore desiderato...
ps.query(conn, params, myRSH); // eseguiamo infine la query

Naturalmente lo stesso oggetto è riusabile per altre operazioni:

Map params2 = new HashMap();
params2.put("id", "456");
ps.query(conn, params2, myRSH);

E' possibile utilizzare anche una mappa nulla per la costruzione delle query, in tal modo verranno usati solo i valori di default dichiarati:

ps.query(conn, null, myRSH);

Il ParaStatement possiede anche i metodi per eseguire insert e batch:

ParaStatement ps = new ParaStatement("INSERT INTO myTable VALUES (${field1,varchar,not specified}, ${field2,integer,0})");
Map params3 = new HashMap();
params3.put("field1", "fieldvalue");
params3.put("field2", new Integer(789));
Map generatedKeys = ps.update(conn, true, params3); // se viene usato false la Map di ritorno sarà vuota...

In tal modo l'oggetto referenziato da generatedKeys conterrà le chiavi che sono state generate automaticamente dal DBRMS nella tabella 'myTable'.
In modo molto simile possiamo eseguire più inserimenti nella stessa transazione utilizzando un comando batch:

Map params4 = new HashMap();
params4.put("field1", "fieldvalueAlt");
params4.put("field2", new Integer(987));
Map[] batchParams = new Map[]{params3, params4};
ps.batch(conn, batchParams);

Esiste infine una "mappa" di ParaStatement che, utilizzando (anche) java.sql.DataSource, permetterebbe l'astrazione delle operazioni su DB ad un livello maggiore:

java.sql.DataSource dataSource = ...
StatementMap staments = new StatementMap(dataSource);
staments.addPredicate("myQuery1", "SELECT * FROM myTable WHERE id>${id,integer,0}"); ...
staments.addPredicate("...", "...");
...
// Possiamo ad un certo punto far eseguire una query staments.query("myQuery1", params1, myRSH);

naturalmente anche la mappa ha i metodi per eseguire i metodi update e batch.
Ultima feature, è quella di caricare la mappa a partire da un oggetto java.util.Properties: supponiamo di definire un file properties come segue:

myQuery1 = SELECT * FROM myTable WHERE id>${id,integer,0}
myQuery2 = SELECT * FROM myTable WHERE id>${id,integer,0} ORDER BY id DESC

A questo punto possiamo caricare la mappa:

Properties p = new Properties();
p.load(new FileInputStream("path/to/my/queries.properties"));
staments.load(p);