At forespørge i en database betyder at søge i dens data. Det gør du ved at sende SQL-angivelser til databasen. For at gøre det skal du først have en åben databaseforbindelse. Når du har en åben forbindelse, skal du oprette et Statement
-objekt, som her:
Statement statement = connection.createStatement();
Når du har oprettet Statement
, kan du bruge det til at udføre SQL-forespørgsler, som her:
String sql = "select * from people";ResultSet result = statement.executeQuery(sql);
Når du udfører en SQL-forespørgsel, får du en ResultSet
tilbage. ResultSet
indeholder resultatet af din SQL-forespørgsel. Resultatet returneres i rækker med kolonner af data. Du iterererer rækkerne i ResultSet
på denne måde:
while(result.next()) { String name = result.getString("name"); long age = result.getLong ("age");}
Metoden ResultSet.next()
flytter til den næste række i ResultSet
, hvis der er flere rækker. Hvis der er flere rækker, returnerer den true. Hvis der ikke var flere rækker, returnerer den false.
Du skal kalde next()
mindst én gang, før du kan læse nogen data. Før det første next()
-kald er ResultSet
placeret før den første række.
Du kan få kolonnedata for den aktuelle række ved at kalde nogle af getXXX()
-metoderne, hvor XXX er en primitiv datatype. For eksempel:
result.getString ("columnName"); result.getLong ("columnName"); result.getInt ("columnName"); result.getDouble ("columnName"); result.getBigDecimal("columnName"); etc.
Kolonnens navn, som værdien af skal hentes, overgives som parameter til et af disse getXXX()
metodekald.
Du kan også overgive et indeks for kolonnen i stedet, som her:
result.getString (1); result.getLong (2); result.getInt (3); result.getDouble (4); result.getBigDecimal(5); etc.
For at det kan fungere, skal du vide, hvilket indeks en given kolonne har i ResultSet
. Du kan få indekset for en given kolonne ved at kalde ResultSet.findColumn()
-metoden som her:
int columnIndex = result.findColumn("columnName");
Hvis du itererer store mængder rækker, kan det være hurtigere at henvise til kolonnerne ved deres indeks end ved deres navn.
Når du er færdig med at iterere ResultSet
, skal du lukke både ResultSet
og Statement
-objektet, der oprettede det (hvis du er færdig med det, dvs. hvis du er færdig med det). Det gør du ved at kalde deres close()
-metoder som her:
result.close();statement.close();
Du bør naturligvis kalde disse mehtoder inden for en finally
blok for at sikre, at de bliver kaldt, selv om der opstår en undtagelse under ResultSet
-iterationen.
Fuldt eksempel
Her er et eksempel på en fuld forespørgselskode:
Statement statement = connection.createStatement();String sql = "select * from people";ResultSet result = statement.executeQuery(sql);while(result.next()) { String name = result.getString("name"); long age = result.getLong("age"); System.out.println(name); System.out.println(age);}result.close();statement.close();
Og her er eksemplet igen, med try-finally
-blokke tilføjet. Bemærk, at jeg har udeladt catch
-blokkene for at gøre eksemplet kortere.
Statement statement = null;try{ statement = connection.createStatement(); ResultSet result = null; try{ String sql = "select * from people"; ResultSet result = statement.executeQuery(sql); while(result.next()) { String name = result.getString("name"); long age = result.getLong("age"); System.out.println(name); System.out.println(age); } } finally { if(result != null) result.close(); }} finally { if(statement != null) statement.close();}