Personalizzazione del set di risultati

La moderna API JDBC ti consente di personalizzare notevolmente gli oggetti.DichiarazioneEset di risultati. Ad esempio, utilizzandoset di risultatiè possibile modificare le righe nel database.

Quando creiamo un oggetto statement, possiamo trasmettervi un mucchio dei nostri desideri. Questi desideri possono essere divisi in tre gruppi:

  • Tipo di connessione di base
  • Controllo degli accessi simultanei
  • Persistenza e transazioni

Questi parametri possono essere passati durante la creazione di un oggettoDichiarazioneODiscorso preparato. Esempio:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

Non studieremo queste cose in profondità, ma voglio che tu sappia che questo è possibile se ti imbatti in qualcosa di simile nel codice di qualcun altro.

Tipi di set di risultati

ResultSet può essere di un tipo specifico. Il tipo definisce alcune delle caratteristiche e capacità del ResultSet.

Non tutti i tipi sono supportati da tutti i database e driver JDBC. Dovrai controllare il tuo database e il driver JDBC per vedere se supporta il tipo che desideri utilizzare. Il metodo DatabaseMetaData.supportsResultSetType(int type) restituisce true o false a seconda che il tipo specificato sia supportato o meno.

Al momento della scrittura, esistono tre tipi di ResultSet:

  • ResultSet.TYPE_FORWARD_ONLY
  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.TYPE_SCROLL_SENSITIVE

Il tipo predefinito è TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY significa che il ResultSet può essere solo spostato in avanti. Cioè, puoi spostarti solo dalla riga 1, riga 2, riga 3, ecc. In un ResultSet, non puoi spostarti indietro: non puoi leggere i dati dalla nona riga dopo aver letto la decima.

TYPE_SCROLL_INSENSITIVE significa che il ResultSet può essere spostato (scorrere) avanti o indietro. Puoi anche spostarti in una posizione relativa alla posizione corrente o spostarti in una posizione assoluta.

Un ResultSet di questo tipo è insensibile alle modifiche all'origine dati sottostante mentre il ResultSet è aperto. Cioè, se una voce nel ResultSet viene modificata nel database da un altro thread o processo, non si rifletterà nel file già apertoset di risultatidi questo tipo.

TYPE_SCROLL_SENSITIVE significa che il ResultSet può essere spostato (scorrere) avanti o indietro. Puoi anche spostarti in una posizione relativa alla posizione corrente o spostarti in una posizione assoluta.

Un ResultSet di questo tipo è sensibile alle modifiche nell'origine dati sottostante mentre il ResultSet è aperto. Cioè, se una voce nel ResultSet viene modificata nel database da un altro thread o processo, si rifletterà nel già apertoset di risultatidi questo tipo.

Concorrenza

La concorrenza di un ResultSet determina se il ResultSet può essere aggiornato o solo letto.

Alcuni database e driver JDBC supportano l'aggiornamento di un ResultSet, ma non tutti. Il metodo DatabaseMetaData.supportsResultSetConcurrency(int concurrency) restituisce true o false a seconda che la modalità di concorrenza specificata sia supportata o meno.

ResultSet può avere uno dei due livelli di concorrenza:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY significa che il ResultSet può essere solo letto.

CONCUR_UPDATABLE indica che ResultSet può essere letto e modificato.

Un esempio di modifica dei dati nel database

Con questi parametri è possibile controllare lo Statement generato e il suo ResultSet.

Ad esempio, è possibile creare un ResultSet aggiornabile e utilizzarlo per modificare il database. Quando si crea una dichiarazione, è importante osservare le seguenti condizioni:

  • è specificata una sola tabella
  • non contiene clausole join o group by
  • le colonne di query devono contenere una chiave primaria

Quando le condizioni di cui sopra sono soddisfatte, il ResultSet aggiornato può essere utilizzato per aggiornare una tabella nel database. Quando si crea un oggetto Statement, è necessario specificare i seguenti parametri:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

Il risultato dell'esecuzione di tale istruzione è un set di risultati aggiornabile. Il metodo update consiste nello spostare il cursore ResultSet sulla riga che si desidera aggiornare e quindi chiamare il metodo updateXXX() .

Il metodo updateXXX funziona in modo simile al metodo getXXX() . Il metodo updateXXX() ha due parametri. Il primo è il numero della colonna da aggiornare, che può essere un nome di colonna o un numero di serie. Il secondo sono i dati che devono essere aggiornati e questo tipo di dati deve essere uguale a XXX.

Per aggiornare effettivamente la riga nel database, è necessario chiamare il metodo updateRow() prima che il cursore ResultSet lasci la riga modificata, altrimenti le modifiche non entreranno nel database.

Puoi anche aggiungere nuove righe alla tabella:

Per prima cosa devi spostare il cursore su una riga vuota. Per fare ciò, chiama il metodo moveToInsertRow() .

Quindi è necessario riempire questa riga con i dati utilizzando il metodo updateXXX() .

Quindi è necessario chiamare il metodo inserterRow() per aggiungere la riga alla base.

E infine, devi riportare indietro il cursore chiamando il metodo moveToCurrentRow() .

Importante! Non tutti i DBMS supportano queste opzioni per l'Extended Statement. In caso di problemi consultare la documentazione ufficiale di un particolare DBMS.