ResultSet anpassning

Det moderna JDBC API låter dig anpassa objekt i hög grad.PåståendeOchresultatet satt. Till exempel att användaresultatet sattdu kan ändra rader i databasen.

När vi skapar ett uttalandeobjekt kan vi skicka in ett gäng av våra önskemål till det. Dessa önskemål kan delas in i tre grupper:

  • Basanslutningstyp
  • Samtidig åtkomstkontroll
  • Uthållighet och transaktioner

Dessa parametrar kan skickas när ett objekt skapasPåståendeellerFörberett uttalande. Exempel:

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 kommer inte att studera dessa saker på djupet, men jag vill att du ska veta att detta är möjligt om du stöter på något liknande i någon annans kod.

Typer av resultatuppsättningar

ResultSet kan vara av en specifik typ. Typen definierar några av egenskaperna och funktionerna för ResultSet.

Alla typer stöds inte av alla databaser och JDBC-drivrutiner. Du måste kontrollera din databas och JDBC-drivrutin för att se om den stöder den typ du vill använda. Metoden DatabaseMetaData.supportsResultSetType(int type) returnerar true eller false beroende på om den givna typen stöds eller inte.

I skrivande stund finns det tre typer av resultatuppsättning:

  • ResultSet.TYPE_FORWARD_ONLY
  • Resultatuppsättning.TYPE_SCROLL_INSENSITIVE
  • ResultSet.TYPE_SCROLL_SENSITIVE

Standardtypen är TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY betyder att ResultSet endast kan flyttas framåt. Det vill säga, du kan bara flytta från rad 1, rad 2, rad 3, etc. I en ResultSet kan du inte flytta bakåt: du kan inte läsa data från den 9:e raden efter att ha läst den tionde.

TYPE_SCROLL_INSENSITIVE betyder att ResultSet kan flyttas (rullas) framåt eller bakåt. Du kan också flytta till en position i förhållande till den aktuella positionen, eller flytta till en absolut position.

En ResultSet av denna typ är okänslig för ändringar i den underliggande datakällan medan ResultSet är öppet. Det vill säga, om en post i ResultSet ändras i databasen av en annan tråd eller process, kommer den inte att återspeglas i den redan öppnaderesultatet sattav denna typ.

TYPE_SCROLL_SENSITIVE betyder att ResultSet kan flyttas (rullas) framåt eller bakåt. Du kan också flytta till en position i förhållande till den aktuella positionen, eller flytta till en absolut position.

En ResultSet av denna typ är känslig för ändringar i den underliggande datakällan medan ResultSet är öppet. Det vill säga, om en post i ResultSet ändras i databasen av en annan tråd eller process, kommer det att återspeglas i den redan öppnaresultatet sattav denna typ.

Samtidighet

Samtidigt som en ResultSet avgör om ResultSet kan uppdateras eller endast läsas.

Vissa databaser och JDBC-drivrutiner stöder uppdatering av en ResultSet, men inte alla. Metoden DatabaseMetaData.supportsResultSetConcurrency(int concurrency) returnerar true eller false beroende på om det givna samtidighetsläget stöds eller inte.

ResultSet kan ha en av två nivåer av samtidighet:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY betyder att ResultSet endast kan läsas.

CONCUR_UPDATABLE betyder att ResultSet kan läsas och modifieras.

Ett exempel på att ändra data i databasen

Med dessa parametrar kan du styra det genererade uttalandet och dess resultatuppsättning.

Du kan till exempel skapa en uppdateringsbar ResultSet och använda den för att ändra databasen. När du skapar ett uttalande är det viktigt att följa följande villkor:

  • endast en tabell anges
  • innehåller inte gå med eller gruppera efter klausuler
  • frågekolumner måste innehålla en primärnyckel

När ovanstående villkor är uppfyllda kan den uppdaterade ResultSet användas för att uppdatera en tabell i databasen. När du skapar ett Statement-objekt måste du ange följande parametrar:

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

Resultatet av att köra en sådan sats är en uppdateringsbar resultatuppsättning. Uppdateringsmetoden är att flytta ResultSet-markören till raden du vill uppdatera och sedan anropa metoden updateXXX() .

Metoden updateXXX fungerar på samma sätt som metoden getXXX() . Metoden updateXXX() har två parametrar. Den första är numret på den kolumn som uppdateras, vilket kan vara ett kolumnnamn eller ett serienummer. Den andra är data som behöver uppdateras, och denna datatyp måste vara samma som XXX.

För att faktiskt uppdatera raden i databasen måste du anropa metoden updateRow() innan ResultSet-markören lämnar den ändrade raden, annars kommer ändringarna inte in i databasen.

Du kan också lägga till nya rader i tabellen:

Först måste du flytta markören till en tom rad. För att göra detta, anropa metoden moveToInsertRow() .

Sedan måste du fylla den här raden med data med metoden updateXXX() .

Sedan måste du anropa metoden inserterRow() för att lägga till raden i basen.

Och slutligen måste du returnera markören tillbaka genom att anropa metoden moveToCurrentRow() .

Viktig! Inte alla DBMS stöder dessa alternativ för det utökade uttalandet. Vid problem, se den officiella dokumentationen för ett visst DBMS.