Tilpasning af resultatsæt

Den moderne JDBC API giver dig mulighed for i høj grad at tilpasse objekter.UdmeldingOgresultatsæt. For eksempel ved at brugeresultatsætdu kan ændre rækker i databasen.

Når vi opretter et statement-objekt, kan vi sende en masse af vores ønsker ind i det. Disse ønsker kan opdeles i tre grupper:

  • Basisforbindelsestype
  • Samtidig adgangskontrol
  • Vedholdenhed og transaktioner

Disse parametre kan overføres, når du opretter et objektUdmeldingellerForberedt Erklæring. 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 vil ikke studere disse ting i dybden, men jeg vil have dig til at vide, at dette er muligt, hvis du støder på noget lignende i en andens kode.

ResultSet typer

ResultSet kan være af en bestemt type. Typen definerer nogle af egenskaberne og mulighederne for ResultSet.

Ikke alle typer understøttes af alle databaser og JDBC-drivere. Du bliver nødt til at tjekke din database og JDBC-driver for at se, om den understøtter den type, du vil bruge. Metoden DatabaseMetaData.supportsResultSetType(int type) returnerer sand eller falsk afhængigt af, om den givne type understøttes eller ej.

I skrivende stund er der tre typer resultatsæt:

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

Standardtypen er TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY betyder, at ResultSet kun kan flyttes fremad. Det vil sige, at du kun kan flytte fra række 1, række 2, række 3 osv. I et ResultSet kan du ikke flytte tilbage: du kan ikke læse data fra 9. række efter at have læst den tiende.

TYPE_SCROLL_INSENSITIVE betyder, at ResultSet kan flyttes (scrolles) frem eller tilbage. Du kan også flytte til en position i forhold til den aktuelle position eller flytte til en absolut position.

Et resultatsæt af denne type er ufølsomt over for ændringer i den underliggende datakilde, mens resultatsættet er åbent. Det vil sige, at hvis en post i resultatsættet ændres i databasen af ​​en anden tråd eller proces, vil det ikke blive afspejlet i det allerede åbnederesultatsætaf denne type.

TYPE_SCROLL_SENSITIVE betyder, at ResultSet kan flyttes (scrolles) frem eller tilbage. Du kan også flytte til en position i forhold til den aktuelle position eller flytte til en absolut position.

Et ResultSet af denne type er følsomt over for ændringer i den underliggende datakilde, mens ResultSet er åbent. Det vil sige, at hvis en post i resultatsættet ændres i databasen af ​​en anden tråd eller proces, vil det blive afspejlet i den allerede åbneresultatsætaf denne type.

Samtidighed

Samtidigheden af ​​et ResultSet afgør, om ResultSet kan opdateres eller kun læses.

Nogle databaser og JDBC-drivere understøtter opdatering af et resultatsæt, men ikke alle. DatabaseMetaData.supportsResultSetConcurrency(int concurrency) -metoden returnerer sand eller false afhængigt af, om den givne samtidighedstilstand er understøttet eller ej.

ResultSet kan have et af to niveauer af samtidighed:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY betyder, at ResultSet kun kan læses.

CONCUR_UPDATABLE betyder, at ResultSet kan læses og ændres.

Et eksempel på ændring af data i databasen

Med disse parametre kan du kontrollere den genererede erklæring og dens resultatsæt.

For eksempel kan du oprette et opdaterbart ResultSet og bruge det til at ændre databasen. Når du opretter en erklæring, er det vigtigt at overholde følgende betingelser:

  • kun én tabel er angivet
  • indeholder ikke join- eller group by-klausuler
  • forespørgselskolonner skal indeholde en primær nøgle

Når ovenstående betingelser er opfyldt, kan det opdaterede ResultSet bruges til at opdatere en tabel i databasen. Når du opretter et Statement-objekt, skal du angive følgende parametre:

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

Resultatet af at udføre en sådan erklæring er et opdaterbart resultatsæt. Opdateringsmetoden er at flytte ResultSet-markøren til den række, du vil opdatere, og derefter kalde updateXXX ()- metoden .

UpdateXXX- metoden fungerer på samme måde som getXXX() -metoden . UpdateXXX() -metoden har to parametre. Den første er nummeret på den kolonne, der opdateres, hvilket kan være et kolonnenavn eller et serienummer. Den anden er de data, der skal opdateres, og denne datatype skal være den samme som XXX.

For rent faktisk at opdatere rækken i databasen, skal du kalde updateRow()- metoden , før ResultSet-markøren forlader den ændrede række, ellers kommer ændringerne ikke ind i databasen.

Du kan også tilføje nye rækker til tabellen:

Først skal du flytte markøren til en tom linje. For at gøre dette skal du kalde metoden moveToInsertRow() .

Så skal du udfylde denne række med data ved hjælp af updateXXX() -metoden .

Derefter skal du kalde metoden inserterRow() for at tilføje rækken til basen.

Og endelig skal du returnere markøren tilbage ved at kalde metoden moveToCurrentRow() .

Vigtig! Ikke alle DBMS'er understøtter disse muligheder for den udvidede erklæring. I tilfælde af problemer, se den officielle dokumentation for et bestemt DBMS.