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