ResultSet-aanpassing

Met de moderne JDBC API kun je objecten sterk aanpassen.StellingEnresultaat ingesteld. Bijvoorbeeld gebruikenresultaat ingesteldu kunt rijen in de database wijzigen.

Bij het maken van een statement-object kunnen we er een aantal van onze wensen aan doorgeven. Deze wensen zijn onder te verdelen in drie groepen:

  • Basis verbindingstype
  • Gelijktijdige toegangscontrole
  • Persistentie en transacties

Deze parameters kunnen worden doorgegeven bij het maken van een objectStellingofVoorbereide verklaring. Voorbeeld:

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

We zullen deze dingen niet diepgaand bestuderen, maar ik wil dat u weet dat dit mogelijk is als u iets soortgelijks tegenkomt in de code van iemand anders.

ResultSet-typen

ResultSet kan van een specifiek type zijn. Het type definieert enkele kenmerken en mogelijkheden van de ResultSet.

Niet alle typen worden door alle databases en JDBC-stuurprogramma's ondersteund. U moet uw database en JDBC-stuurprogramma controleren om te zien of deze het type ondersteunen dat u wilt gebruiken. De methode DatabaseMetaData.supportsResultSetType(int type) retourneert waar of onwaar , afhankelijk van of het opgegeven type wordt ondersteund of niet.

Op het moment van schrijven zijn er drie soorten ResultSet:

  • Resultaatset.TYPE_FORWARD_ONLY
  • Resultaatset.TYPE_SCROLL_INSENSITIVE
  • Resultaatset.TYPE_SCROLL_SENSITIVE

Het standaardtype is TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY betekent dat de ResultSet alleen naar voren kan worden verplaatst. Dat wil zeggen, u kunt alleen verplaatsen van rij 1, rij 2, rij 3, enz. In een ResultSet kunt u niet achteruit: u kunt geen gegevens lezen van de 9e rij na het lezen van de tiende.

TYPE_SCROLL_INSENSITIVE betekent dat de ResultSet vooruit of achteruit kan worden verplaatst (gescrolld). U kunt ook naar een positie gaan die relatief is ten opzichte van de huidige positie, of naar een absolute positie gaan.

Een ResultSet van dit type is ongevoelig voor wijzigingen in de onderliggende gegevensbron terwijl de ResultSet open is. Dat wil zeggen, als een item in de ResultSet in de database wordt gewijzigd door een andere thread of een ander proces, wordt dit niet weerspiegeld in de reeds geopenderesultaat ingesteldvan dit type.

TYPE_SCROLL_SENSITIVE betekent dat de ResultSet vooruit of achteruit kan worden verplaatst (gescrolld). U kunt ook naar een positie gaan die relatief is ten opzichte van de huidige positie, of naar een absolute positie gaan.

Een ResultSet van dit type is gevoelig voor wijzigingen in de onderliggende gegevensbron terwijl de ResultSet open is. Dat wil zeggen, als een item in de ResultSet in de database wordt gewijzigd door een andere thread of een ander proces, wordt dit weerspiegeld in de reeds geopenderesultaat ingesteldvan dit type.

gelijktijdigheid

De gelijktijdigheid van een ResultSet bepaalt of de ResultSet kan worden bijgewerkt of alleen kan worden gelezen.

Sommige databases en JDBC-stuurprogramma's ondersteunen het bijwerken van een ResultSet, maar niet allemaal. De methode DatabaseMetaData.supportsResultSetConcurrency(int concurrency) retourneert waar of onwaar , afhankelijk van of de gegeven gelijktijdigheidsmodus wordt ondersteund of niet.

ResultSet kan een van twee niveaus van gelijktijdigheid hebben:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY betekent dat de ResultSet alleen kan worden gelezen.

CONCUR_UPDATABLE betekent dat de ResultSet gelezen en gewijzigd kan worden.

Een voorbeeld van het wijzigen van gegevens in de database

Met deze parameters kunt u het gegenereerde Statement en de bijbehorende ResultSet beheren.

U kunt bijvoorbeeld een bij te werken ResultSet maken en deze gebruiken om de database te wijzigen. Bij het maken van een Verklaring is het belangrijk om de volgende voorwaarden in acht te nemen:

  • er is slechts één tabel opgegeven
  • bevat geen join- of group by-clausules
  • querykolommen moeten een primaire sleutel bevatten

Wanneer aan bovenstaande voorwaarden is voldaan, kan de bijgewerkte ResultSet worden gebruikt om een ​​tabel in de database bij te werken. Bij het maken van een Statement-object moet u de volgende parameters opgeven:

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

Het resultaat van het uitvoeren van een dergelijke instructie is een bij te werken resultatenset. De updatemethode is om de ResultSet-cursor naar de rij te verplaatsen die u wilt bijwerken en vervolgens de updateXXX()- methode aan te roepen .

De methode updateXXX werkt op dezelfde manier als de methode getXXX() . De methode updateXXX() heeft twee parameters. De eerste is het nummer van de kolom die wordt bijgewerkt. Dit kan een kolomnaam of een serienummer zijn. De tweede zijn de gegevens die moeten worden bijgewerkt en dit gegevenstype moet hetzelfde zijn als XXX.

Om de rij in de database daadwerkelijk bij te werken, moet u de methode updateRow() aanroepen voordat de ResultSet-cursor de gewijzigde rij verlaat, anders komen de wijzigingen niet in de database terecht.

U kunt ook nieuwe rijen aan de tabel toevoegen:

Eerst moet u de cursor naar een lege regel verplaatsen. Roep hiervoor de methode moveToInsertRow() aan .

Vervolgens moet u deze rij vullen met gegevens met behulp van de methode updateXXX() .

Vervolgens moet u de methode inserterRow() aanroepen om de rij aan de basis toe te voegen.

En ten slotte moet u de cursor terugzetten door de methode moveToCurrentRow() aan te roepen .

Belangrijk! Niet alle DBMS'en ondersteunen deze opties voor het uitgebreide Statement. Raadpleeg bij problemen de officiële documentatie van een bepaald DBMS.