Het SQL statement dat we kunnen gebruiken om alle bieren op te vragen met al hun gegevens is onderstaand statement.
SELECT * FROM Beers;
Dit commando kunnen we gebruiken in onze Java code om zo een verzameling terug te krijgen van de gegevens. We tonen dit hier even in een code voorbeeld.
String sql = "select * from Beers;";
try (
Connection connect = DriverManager.getConnection(
"jdbc:mariadb://javadev-training.be/javadevt_Lf001",
"javadevt_StudLf",
"STUDENTlf2020");
Statement statement = connect.createStatement();
ResultSet result = statement.executeQuery(sql)
) {
...
)
Hier zie je dat we het Statement aanmaken via het object van onze connectie. Statement is zelf ook AutoCloseable dus deze wordt ook in de try with resources geplaatst. Dit geld ook voor de ResultSet. Dit object bevat onze gegevens die we net aan de databank hebben gevraagd. Op het einde van dit code blok, als we het resultaat niet meer nodig hebben wordt dit nu automatisch afgesloten en opgeruimd via de try with resources.
Een ResultSet is dus vergelijkbaar met een tabel waarin we kunnen bewegen om zo de gegevens op te vragen die in de tabel staan. Wanneer we de ResultSet voor de eerste keer benaderen, staan we nog buiten deze tabel. We moeten eerst telkens de juiste rij gaan selecteren alvorens we gegevens kunnen opvragen.
Om dit navigeren te vergemakkelijken spreken we geregeld van de cursor. Dit is de denkbeeldige plaats van waar ons programma zich bevindt in deze tabel. De cursor start dus altijd net voor de eerste rij in de tabel. Met onderstaande methoden kunnen we dan de positie van de cursor gaan aanpassen in de tabel, enzo dus andere rijen gaan opvragen.
Methode | Omschrijving |
next() | Verplaatst de cursor naar de volgende rij |
first() | Verplaatst de cursor naar de eerste rij |
last() | Verplaatst de cursor naar de laatste rij |
previous() | Verplaatst de cursor naar de vorige rij |
afterLast() | Verplaatst de cursor na de laatste rij |
beforeFirst() | Verplaatst de cursor voor de eerste rij (default locatie) |
absolute() | Verplaatst de cursor naar een bepaalde rij |
relative() | Verplaatst de cursor een aantal rijen vooruit (+) of achteruit (-) t.o.v. de huidige positie van de cursor |
Al deze methoden geven een boolean terug. Als deze de waarde true heeft, dan is er met de methode een nieuwe rij bekomen. Er zijn dus gegevens die we kunnen inlezen. Indien de waarde false is, is de cursor op het einde van de tabel gekomen en zijn er geen verdere gegevens.
Dit vergemakkelijkt onze werking. Want nu kunnen we bij een aanvraag, gebruik maken van deze methoden en een while loop om over elke rij in de tabel te lopen.
while (result.next()) {
// Hier komt code die iets met de gegevens doet
}
De ResultSet die we tot nog toe hebben gebruikt, kan enkel gebruik maken van de next methode. Dit komt omdat niet alle JDBC drivers het mogelijk maakt om navigeerbare ResultSets op te bouwen. Dit is ook paas bij JDBC Drivers van versie 2.0 en hoger mogelijk. Dit soort navigeerbare ResultSets noemen we scrollable resultsets.
Om deze Scrollable ResultSets te gaan gebruiken moeten we bij de create van ons Statement hier al rekening mee gaan houden. De methode createStatement() heeft namelijk een overload die dit voor ons kan regelen. We kunnen hier namelijk ook twee argumenten aan meegeven.
De eerste parameter geeft het type van de ResultSet weer. maw of deze navigeerbaar is of niet. De tweede parameter geeft aan of een ResultSet aanpassingen mag ondergaan of niet. De invulling van deze parameters gebeurt aan de hand van constanten die in de klasse ResultSet zijn gedefinieerd.
Constante | Omschrijving |
TYPE_FORWARD_ONLY | De RS kan enkel voorwaarts worden doorgenomen met behulp van de methode next(). Dit is de standaard waarde zodat de standaard compatibel is met de JDBC Drivers 1.0+ versies |
TYPE_SCROLL_INSENSITIVE | De RS kan in alle richtingen worden doorgenomen. De gegevens worden niet telkens gesynchroniseerd met de databank |
TYPE_SCROLL_SENSITIVE | De RS kan in alle richtingen worden doorgenomen. De gegevens worden telkens gesynchroniseerd met de databank |
CONCUR_READ_ONLY | De RS kan enkel gelezen worden en niet aangepast. Dit is de standaard waarde zodat de standaard compatibel is met de JDBC Drivers 1.0+ versies |
CONCUR_UPDATABLE | De RS kan ook gewijzigd worden |
We kunnen de eerste drie dus gebruiken als argument voor de eerste parameter, en de laatste twee als argument voor de tweede parameter van de methode createStatement(). Wanneer we de methode gebruiken zonder parameters, dan maken we automatisch gebruik van de twee standaard constanten (TYPE_FORWARD_ONLY & CONCUR_READ_ONLY).
Een Scrollable ResultSet creëren we dus op de volgende manier.
String sql = "select * from Beers;";
try (
Connection connect = DriverManager.getConnection(
"jdbc:mariadb://javadev-training.be/javadevt_Lf001",
"javadevt_StudLf",
"STUDENTlf2020");
Statement statement = connect.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY
);
ResultSet result = statement.executeQuery(sql)
) {
...
)