PDA

View Full Version : [Java] PreparedStatement e operazioni su DB


ShadowX84
16-05-2007, 13:49
Salve,

Stò frequetando un corso di java molto accelerato (purtroppo), ma la mia azienda questo mi passa :)

Nell'ultima sessione mi hanno spiegato la connessione al DB, l'esecuzione delle operazioni fondamentali su DB, il commit/rollback ed altre cosette.

Capirete che anche se non sono moltissime cose, per me che non ho mai visto nulla del genere prima d'ora, possano spaesarmi un pochino...anzi...un tantino :D

Rileggendo il codice ho notato che sono presenti due elementi: lo Statement ed il PreparedStaement.

Ho capito che ricorrendo all'uso del secondo si ottengono dei benefici in quanto si prepara a priori l'esecuzione di un'istruzione (query) che verrà richiamata successivamente.

Però onestamente faccio ancora fatica a capire come, dove e quando è utile ricorrere ad uno anzichè ad un altro, e/o se c'è una regola generale al riguardo.

Grazie! ;)

PGI-Bis
16-05-2007, 14:37
Non escludo che ce ne siano altri ma i due benefici a meno noti del prepared statement starebbero nell'evitare lo SQL Injection, cioè l'alterazione della query sql ideale tramite l'uso di stringhe costruite ad hoc, e nella possibilità di usare i tipi di dato Java, lasciando che sia il driver ad operare la conversione in valori SQL.

La prima è una cosa che so per sentito dire e te la rifilo cum grano salis.

La seconda è un'evidenza strutturale. E' come dire che al posto di scrivere:

INSERT INTO Clienti VALUES ('pippo', 'rossi', 3, 4.25)

(probabilmente è sql maccheronico ma facciamo finta che sia sql)

posso scrivere:

INSERT INTO Client VALUES (nome, cognome, quantità, prezzoUnitario)

dove

nome e cognome sono String, quantità è un int e prezzoUnitario un BigDecimal.

Praticamente è un pelo macchinoso perchè l'impostazione dei valori della query richiede n invocazioni del metodo set (strano che non abbiano usato i varargs). Cioè per usare i tipi Java io devo dire:

statement.setString(1, "Pippo");
statement.setString(2, "Rossi");
statement.setInt(3, 3);
statement.setBigDecimal(4, new BigDecimal(4.25));

con statement istanza di PreparedStatement. C'è anche la stravaganza dell'indice che parte da 1.

Vale la pena di dire che JDBC non si usa. Nel mondo reale ci sono dei framework ad hoc costruiti intorno a JDBC (Hybernate ad esempio) a cui ci si appoggia per gestire la persistenza dei dati in Java.