Tipi di dichiarazioni

Abbiamo già visto l' interfaccia Statement più semplice . E sebbene sia abbastanza adatto per il lavoro, non è così adatto per query complesse. In alcune fonti, si esprime l'opinione che non sia affatto necessario utilizzare Statement : sono invece adatte interfacce più complesse e più ricche di funzionalità.

  • Discorso preparato
  • CallableStatement

Sorge una domanda abbastanza ragionevole: perché sono necessarie queste interfacce? Scopriamolo.

Innanzitutto, daremo un'occhiata all'interfaccia PreparedStatement e ad altre funzionalità JDBC. Passeremo all'interfaccia CallableStatement in seguito: il suo utilizzo, in primo luogo, non è così comune e, in secondo luogo, dopo tutto ciò che è stato considerato, la conversazione può già essere piuttosto breve.

Inoltre, PreparedStatement è di grande aiuto dal popolare approccio all'hacking del database chiamato SQL Injection.

Ma ne riparleremo un po 'più tardi.

Discorso preparato

Se provi a tradurre il nome PreparedStatement , puoi ottenere qualcosa come "dichiarazione preparata". La parola più importante qui è "preparato". Cos'è la "preparazione"?

Prima di considerare questo problema, propongo di vedere un punto piuttosto importante dal punto di vista della convenienza, che si verifica molto spesso. Quindi, in alcune applicazioni, abbiamo bisogno di inserire i dati di contatto nella tabella CONTACT. Per fare ciò, dobbiamo preparare una query come questa:

INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);

A prima vista, sembra che tutto non sia così difficile e spaventoso. Dobbiamo scrivere un codice che raccoglierà la stringa di cui abbiamo bisogno dai parametri: nome, cognome, indirizzo e numero di telefono. Devi solo ricordare che tutti i dati della stringa devono essere racchiusi da un singolo carattere di virgolette.

Se lo facciamo in una funzione separata, otteniamo qualcosa del genere:

public String buildInsert(String firstName,, String lastName, String phone, String email) {
    String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)+
             	”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
    return sql;
}

Passiamo il nome, il cognome, il numero di telefono e l'indirizzo nella funzione parametro nel modulo e da questi componiamo una stringa di query SQL. Le citazioni rovinano un po 'l'immagine, ma finora non fa paura.

Ok, e i numeri? Non hanno bisogno di essere circondati da virgolette. Opanki, in un caso hai bisogno di citazioni, nell'altro no. La situazione si fa sempre più complicata.

Ora aggiungiamo un altro problema: cosa succede se c'è una citazione ordinaria (e nemmeno una) all'interno della stringa? Devi prima cercare tali citazioni ed elaborarle. Mdaaa. In qualche modo iniziamo a sentirci a disagio.

Se ora aggiungiamo l'elaborazione della data, l'attività diventa completamente noiosa: devi fare un'enorme quantità di lavoro. Le date sono generalmente spiacevoli: diversi server SQL accettano formati diversi per le date.

Quindi cosa vediamo? Se dobbiamo utilizzare parametri all'interno della query, la creazione manuale della query diventa molto spiacevole. E non solo sgradevole, direi anche noioso. C'è un numero enorme di casi da considerare e questo è un lavoro terribilmente noioso. Fondamentalmente, è per questi casi che è stata proposta l' interfaccia PreparedStatement .

Questa richiesta ti permette di fare due cose:

  • Preparare preventivamente una richiesta indicando i luoghi in cui verranno sostituiti i parametri
  • Impostare i parametri di un certo tipo e quindi eseguire una query con i parametri già impostati

Esempio di istruzione preparata

La struttura per PreparedStatement per la nostra opzione di impostazione dei parametri sarà simile a questa:

// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";

// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";

// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);

// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);

// Execute the request
stmt.executeUpdate();

Come puoi vedere, tutto è abbastanza semplice.

Innanzitutto, quando si scrive una query SQL, i punti in cui i parametri dovranno essere sostituiti vengono scritti con punti interrogativi - "?".

In secondo luogo, la richiesta viene creata chiamando con.prepareStatement() .

In terzo luogo, l'impostazione dei parametri passa attraverso l'indicazione del numero e del valore. Si noti che il numero di parametri inizia da 1, non da 0, come siamo abituati a lavorare con array e raccolte.

L' interfaccia PreparedStatement contiene metodi per l'impostazione di stringhe — setString() , per l'impostazione di numeri — setInt() , setLong() , setDouble() , per l'impostazione di date — setDate() . E tipi più complessi: questo può essere visto nella documentazione.

In quarto luogo, la chiamata a stmt.executeUpdate() è già stata eseguita senza specificare la stringa di query.

Consiglio vivamente di fare amicizia con PreparedStatement : questo è uno strumento molto efficace.