Saying Hello
Introductie
Gegevens Opvragen
Gegevens Aanpassen
Geavanceerde Onderwerpen
Los gekoppelde systemen
Eind Opdracht:Sweet Kitty Shop
Saying Goodbye

Wijzigbare resultsets

Wanneer we gegevens wijzigen met een update statement, moet de ontwikkelaar op voorhand deze commando’s goed uitdenken. Hierdoor laten ze weinig aanpasbaarheid voor de gebruiker van de software. Om dit tegen te gaan, en meer flexibiliteit te krijgen, is het ook mogelijk om een ResultSet te verkrijgen die we kunnen aanpassen en opslaan naar de databank.

ALERT!
Niet elke JDBC Driver kan deze ResultSet opvragen. De JDBC versie moet hier minstens versie 2.0 zijn.

Om een wijzigbare ResultSet te verkrijgen, moeten we bij het aanmaken van het Statement de parameter CONCUR_UPDATABLE meegeven. Deze zal er voor zorgen dat de ResultSet aanpasbaar is.

Niet elk SQL-commando kan gebruikt worden in combinatie met een wijzigbare Resultset. Het SQL-commando moet voldoen aan de volgende twee voorwaarden.

  1. De primaire sleutel moet vervat zijn in de ResultSet
  2. De ResultSet mag enkel gegevens bevatten uit één tabel, er mogen dus geen Join operaties aanwezig zijn.

ALERT!
Niet elke databank ondersteunt aanpasbare ResultSets. Na het opvragen kunnen we dit controleren door op de ResultSet de methode getResultSetConcurrency() op te roepen. Dit moet dan een integer waarde terug geven die overeenkomt met de constante CONCUR_UPDATABLE.


Om gegevens nu te kunnen aanpassen in een rij, moeten we eerst de cursor verplaatsen naar de juiste rij waar we de aanpassing willen uitvoeren.

Eenmaal we de cursor in de juiste rij hebben geplaatst, kunnen we gebruik maken van de UpdateXXX(String Name | int index, XXX change) methode gebruiken. Hierbij hebben we twee parameters, een locatie bepaler (String Name of int index) en een XXX change, waarbij XXX het datatype is die bepaald is in het methode voorschrift. Deze change is de nieuwe waarde voor dat attribuut van die rij/entiteit.

...
result.first();
result.updateDouble("Price", 3.36);
...

We kunnen verschillende wijzigingen uitvoeren in dezelfde rij alvorens deze op te slaan met de methode updateRow(). Na deze methode zijn de wijzigingen doorgevoerd naar de databank.

Indien je de cursor uit de rij verwijderd alvorens de veranderingen op te slaan, gaan alle wijzigingen verloren.

Wil je de veranderingen annuleren. Dan kan dit ook me de methode cancelRowUpdates()

We plaatsen hier een code voorbeeld voor aanpassingen op de volledige manier en eens met de JdbcFacade.

String sql = "Select * From Beers;";

try (
   Connection connect = DriverManagere.getConnection(url, login, psw);
   Statement statement = connect.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
   ResultSet result = statement.executeQuery(sql);
) {
   
   result.first();
   result.updateDouble("Price", 45.36);
   result.updateRow();

}
String sql = "Select * From Beers;";

try (
   JdbcFacade jdbcHelper = new JdbcFacade();
   ResultSet result = jdbcHelper.executeQueryNavigableUpdatable(sql);
) {
  
   result.first();
   result.updateDouble("Price", 45.36);
   result.updateRow();

}