Tilpasning av resultatsett

Den moderne JDBC API lar deg tilpasse objekter i stor grad.UttalelseOgresultatsett. For eksempel ved å brukeresultatsettdu kan endre rader i databasen.

Når vi oppretter et utsagnsobjekt, kan vi sende en haug av våre ønsker inn i det. Disse ønskene kan deles inn i tre grupper:

  • Base tilkoblingstype
  • Samtidig tilgangskontroll
  • Utholdenhet og transaksjoner

Disse parameterne kan sendes når du oppretter et objektUttalelseellerForberedt uttalelse. Eksempel:

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

Vi skal ikke studere disse tingene i dybden, men jeg vil at du skal vite at dette er mulig hvis du kommer over noe lignende i andres kode.

Resultatsetttyper

ResultSet kan være av en bestemt type. Typen definerer noen av egenskapene og egenskapene til ResultSet.

Ikke alle typer støttes av alle databaser og JDBC-drivere. Du må sjekke databasen og JDBC-driveren for å se om den støtter typen du vil bruke. DatabaseMetaData.supportsResultSetType(int type) -metoden returnerer true eller false avhengig av om den gitte typen støttes eller ikke.

I skrivende stund er det tre typer resultatsett:

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

Standardtypen er TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY betyr at resultatsettet bare kan flyttes fremover. Det vil si at du bare kan flytte fra rad 1, rad 2, rad 3 osv. I et ResultSet kan du ikke flytte bakover: du kan ikke lese data fra 9. rad etter å ha lest den tiende.

TYPE_SCROLL_INSENSITIVE betyr at ResultSet kan flyttes (scrolles) forover eller bakover. Du kan også flytte til en posisjon i forhold til gjeldende posisjon, eller flytte til en absolutt posisjon.

Et resultatsett av denne typen er ufølsomt for endringer i den underliggende datakilden mens resultatsettet er åpent. Det vil si at hvis en oppføring i resultatsettet endres i databasen av en annen tråd eller prosess, vil den ikke gjenspeiles i den allerede åpnederesultatsettav denne typen.

TYPE_SCROLL_SENSITIVE betyr at ResultSet kan flyttes (scrolles) forover eller bakover. Du kan også flytte til en posisjon i forhold til gjeldende posisjon, eller flytte til en absolutt posisjon.

Et resultatsett av denne typen er følsomt for endringer i den underliggende datakilden mens resultatsettet er åpent. Det vil si at hvis en oppføring i resultatsettet endres i databasen av en annen tråd eller prosess, vil det gjenspeiles i den allerede åpneresultatsettav denne typen.

Samtidighet

Samtidigheten til et resultatsett avgjør om resultatsettet kan oppdateres eller kun leses.

Noen databaser og JDBC-drivere støtter oppdatering av et resultatsett, men ikke alle. DatabaseMetaData.supportsResultSetConcurrency(int concurrency) -metoden returnerer true eller false avhengig av om den gitte samtidighetsmodusen støttes eller ikke.

ResultSet kan ha ett av to nivåer av samtidighet:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY betyr at resultatsettet bare kan leses.

CONCUR_UPDATABLE betyr at resultatsettet kan leses og endres.

Et eksempel på endring av data i databasen

Med disse parameterne kan du kontrollere den genererte erklæringen og dens resultatsett.

Du kan for eksempel opprette et oppdaterbart resultatsett og bruke det til å endre databasen. Når du oppretter en erklæring, er det viktig å overholde følgende betingelser:

  • kun én tabell er spesifisert
  • inneholder ikke join- eller group by-klausuler
  • spørringskolonner må inneholde en primærnøkkel

Når vilkårene ovenfor er oppfylt, kan det oppdaterte resultatsettet brukes til å oppdatere en tabell i databasen. Når du oppretter et Statement-objekt, må du spesifisere følgende parametere:

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

Resultatet av å utføre en slik setning er et oppdaterbart resultatsett. Oppdateringsmetoden er å flytte ResultSet-markøren til raden du vil oppdatere og deretter kalle opp updateXXX()- metoden .

UpdateXXX- metoden fungerer på samme måte som getXXX()- metoden . UpdateXXX()- metoden har to parametere. Den første er nummeret på kolonnen som oppdateres, som kan være et kolonnenavn eller et serienummer. Den andre er dataene som må oppdateres, og denne datatypen må være den samme som XXX.

For å faktisk oppdatere raden i databasen, må du kalle opp updateRow()- metoden før ResultSet-markøren forlater den endrede raden, ellers kommer ikke endringene inn i databasen.

Du kan også legge til nye rader i tabellen:

Først må du flytte markøren til en tom linje. For å gjøre dette, kall moveToInsertRow() -metoden .

Deretter må du fylle denne raden med data ved å bruke updateXXX() -metoden .

Deretter må du kalle inserterRow()- metoden for å legge raden til basen.

Og til slutt må du returnere markøren tilbake ved å kalle moveToCurrentRow()- metoden .

Viktig! Ikke alle DBMS-er støtter disse alternativene for den utvidede erklæringen. I tilfelle problemer, se den offisielle dokumentasjonen for en bestemt DBMS.