Programmazione
Asp
Asp.NET
Java
Javascript
Php
Oracle

Svaghi
Ascolta Radio
Faccine
Libri
Links

Varie
Cerca nel sito...
Segnalazioni
Scrivimi


JAVA date e jdbc

Supponiamo di dover inserire una data in una certa tabella di una base dati. Per rendere più interessante il problema possiamo immaginare un programma Java con un’interfaccia grafica dalla quale leggiamo tre stringhe che rappresentano rispettivamente il giorno, il mese e l’anno; in alternativa, se siamo in ambito web, ipotizziamo di aver ottenuto i tre medesimi parametri di input da una FORM. Nel mondo dei DBMS manca di fatto uno standard per il formato delle date. Chiunque abbia lavorato con almeno due db diversi (p.e Oracle e Sybase) sa che non c’è dato rappresentato in modo più fantasioso. Utilizzare una funzione di conversione di una stringa in una data legherebbe troppo il testo della nostra query ad un particolare database vanificando in parte la portabilità che lo standard JDBC assicura. Di seguito una descrizione di cosa fare per poter evitare questo inconveniente.

Lo standard JDBC prevede la possibilità di usare particolari sequenze di escape, ovvero stringhe ed espressioni che vengono tradotte automaticamente dal driver nel formato specifico atteso da un particolare database.
Ciascuna sequenza di escape ha questa sintassi generale:
{parola chiave. . . parametri . . . }


Tre di queste sequenze possono essere usate per date, time, timestamp. Per chiarezza, una date è una sequenza di giorno mese e anno, mentre un dato di tipo time (tempo) è una sequenza formata da ore, minuti, secondi rappresentati da due cifre. Timestamp è una data completa di giorno, mese, anno, ore, minuti e secondi.
Per i tre tipi di dato indicati avremo:
·{d 'yyyy-mm-dd'}: traduce una data nel formato appropriato e riconosciuto dal database; per esempio {d ‘2001-03-24’} potrebbe essere tradotto in ‘24-03-2001’ se il DMBS riconosce questo formato;
·{t 'hh:mm:ss'}: traduce un dato di tipo time nel formato riconosciuto dal DBMS;
·{ts 'yyyy-mm-dd hh:mm:ss.f . . .'}: come sopra J.


La parte frazionaria dei secondi nei dati di tipo timestamp (.f . . .) può essere omessa. Supponiamo, per esempio, di voler inserire un record in una tabella Ordini. I campi da compilare sono nome e cognome cliente e la data dell’ordine.
L’esempio è stato fatto con una query di inserimento, ma rimane valido per ogni altro tipo di interrogazione o operazione sul database. Come si può vedere, questa sintassi rende completamente portabile la query. Si deve però ricordare che questo approccio non deve essere utilizzato per le query precompilate, usate negli oggetti Java di tipo PreparedStatement. In tal caso la conversione è automatica e si devono utilizzare le classi java.sql.Date e java.util.Date.

Listato 1 – JDBC e Date
/* Frammento di codice per l’uso delle sequenze di escape per le date.
* Suppongo che il driver sia stato già correttamente caricato,
* la connessione sia avvenuta con successo ed esista un oggetto di tipo
* java.sql.Statement di nome stm
*/

int numrighe=stm.executeupdate(
        “INSERT INTO Ordini(NomeCliente,CognomeCliente,DataOrdine) ”+
        “VALUES (‘Mario’,’Rossi’,{d ‘2002-01-21’})”
);